事情的起源是无意中搜到了一个 8K 视频,自然想着要体验一下。在我手机上理所当然地无法播放,在我笔记本上可以正常播放。本来这样就完了,不过遗憾的是我的显示屏只有 2K,并不能真正体验到 8K 的效果,于是找了一个有 4K 显示屏的同学来尝试(虽然还是不够……),结果他不能正常播放。
Youtube 的视频在 4K 及以下用的都是 VP9 编码,但是到了 8K 就变成了 AV1 编码(不是 AVC1)。这个 AV1 要 30 系显卡才能硬解,而他的显卡是 10 系,只能软解这个 8K 视频,当然是无力回天。
于是用 yt-dlp 把这个视频下载下来,试图转换成其他编码播放。由于解码实在是很慢,中间尝试了在有 30 系显卡的服务器上转码,但是 ffmpeg 的一般版本似乎不支持硬解 av1。在 Nvidia 的网站上找了个编译说明,手动编译了 ffmpeg,不知道为什么还是不愿意硬解,最后只好放弃。转成 HEVC 之后,在他的电脑上就可以正常播放了。
到这里好像都结束了,其实还有一个问题没有解决:为什么一开始在我的笔记本上可以正常播放?
我笔记本的显卡有 i7-1165G7 的核显和 MX450,后者根本不支持音视频编解码,反而是前者还支持硬解 AV1。在上面对各种编码和各种播放方案进行了测试,结果如下:
PotPlayer 内置 ffmpeg | PotPlayer 外接 LAV Video Decoder | Chrome | Firefox | |
---|---|---|---|---|
AVC | 软解 | 软解 | 软解 | 无法播放 |
HEVC | 硬解,画面跟不上声音 | 硬解,画面跟不上声音 | 不支持 | 不支持 |
VP9 | 硬解,画面跟不上声音 | 硬解,画面跟不上声音 | 正常硬解 | 软解 |
AV1 | 正常硬解 | 硬解,画面跟不上声音 | 正常硬解 | 软解 |
直接在 Youtube 上播放的时候,因为正好 Chrome 可以正确调用 AV1 的硬解,所以才能正常播放。
命令行
最后记录一下命令行,都是直接调用 ffmpeg,没有配置额外选项。
首先是 yt-dlp 只能下载单独的视频轨和音频轨,可以先将两者合并成 av1.mp4
:
1 | ffmpeg -i video.mp4 -i audio.webm -c copy av1.mp4 |
之后的转码的命令行如下:
1 | ffmpeg -i av1.mp4 -c:a copy -c:v h264 avc.mp4 |
也可以最后再合并音轨,不过封装音轨不费什么时间,没多大区别。