源链接:https://gist.github.com/dvaupel/716598fc9e7c2d436b54ae00f7a34b95
开源编码器
- AOMEnc1:由AOM开发,具有最多功能和最高质量的参考编码器。
- SVT-AV1:由Intel开发,性能高且针对并行性优化的生产级编码器。
- Rav1e:由Mozilla/Xiph开发,被Vimeo使用2。
由于这些工具仍在积极开发中,你应该总是使用最新版本,并在必要时自己编译独立的编码器。
我选择了SVT-AV1,因为它在我的中档CPU上提供了最佳的速度/质量权衡。
辅助工具
- handbreak:用于FFmpeg管道的图形界面。
- Av1an:跨平台的现代编码器包装器,带有方便的额外功能和性能提升,如增强的多线程、停止/继续编码、VMAF质量设置。
- StaxRip3:用于高级编码的Windows图形界面。
- NEAV1E4:Windows图形界面编码器。
- nmkoder5:用于编码和分析的Windows图形界面。
SvtAv1EncApp 参数
官方参数文档:
https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/svt-av1_encoder_user_guide.md
以下经验法则来自于个人测试和外部资源,如AV1 subreddit。
—crf {1-63}
在默认的速率控制模式 (--rc 0
) 下,这是控制输出视觉质量的主要参数。
编码器试图确保恒定的质量,而不考虑结果比特率。较低的CRF意味着更高的质量和更大的文件大小。
规则:CRF 30
是一个好的起点,大致相当于 x265 的 CRF 21
。
—enable-overlays {0,1}
启用可以提高关键帧的质量,应该始终保持开启(1)。
—enable-restoration {0,1}
todo
—enable-tf {0,1}
(禁用/启用)alt ref 帧的时间过滤。
禁用 (--enable-tf 0
) 可以稍微保留更多细节,但会增加文件大小。
—film-grain {0-50}
启用胶片颗粒合成。编码器对源进行降噪(值越高表示降噪越强),并将噪声参数保存在查找表中。解码器可以在回放期间使用该表重新创建颗粒。这大幅减少了颗粒画面所需的比特率。
此参数应匹配源素材的颗粒度。但在实验后,我个人得出结论,它目前最适合轻度到中等颗粒度的素材。需要改进。
—input-depth {8, 10}
视频处理的位深度。通常应设置为10位以减少带状伪影和其他瑕疵。
请注意,这不会改变位深度,只是告诉编码器源是什么。如果你想从8位源创建10位编码,你必须使用ffmpeg转换源(见下文)。
问题:在我的测试中,10位导致某些场景出现卡顿。播放性能仍然是一个问题。
—keyint {int}
指定关键帧之间的最大距离。较小的间隔使寻址更快,但较大的间隔会减少文件大小。
一般规则:keyint = 10 * 帧速率,例如24 fps时为240。
—preset {0-13}
编码速度和效率,越高效率越高。
粗略估计:8
类似于x265 medium
,6
类似于x265 slow
。
每个步骤的编码时间变化很大。以下是一些快速测试的结果,使用的是30秒、1080p、24 fps的电影片段,启用了颗粒合成(不具代表性)。
预设 | 编码时间 / s | 文件大小 / MB |
---|---|---|
3 | 781 | 10.4 |
4 | 340 | 10.6 |
5 | 231 | 10.6 |
6 | 146 | 10.8 |
7 | 115 | 10.9 |
8 | 109 | 10.8 |
规则:合理的时间/质量比率在4-8之间,6是一个好的起点。>=8适用于实时编码(直播),<4很少值得。
—scd {0,1}
禁用/启用场景变化检测。除非你使用恒定比特率,否则总是有好处的。
其他技巧
通过FFMPEG管道输入SvtAv1EncApp
SVT编码器只接受未压缩的Y4MPEG流(*.y4m
)。如果你的文件是其他格式,你可以使用FFMPEG解码它。
ffmpeg -i input.mp4 -pix_fmt yuv420p10le -f yuv4mpegpipe -strict -1 - | SvtAv1EncApp -i stdin ...
改变帧率
SVT编码器本身不能改变帧率。它的 --fps
标志仅作为内部提示用于速率控制(我认为)。
相反,我们可以使用ffmpeg的 fps
滤镜,并将具有所需帧率的流通过管道输入编码器。
ffmpeg -i in.mp4 -vf fps=fps=30 -strict -1 -f yuv4mpegpipe - |SvtAv1EncApp -i stdin --fps 30 --keyint 300 <其他选项...> -b out.ivf
当前问题
- 在普通消费硬件上,10位播放性能还不够可靠。
- 即使在高比特率下,AV1也会明显平滑视频。这在雨、雪等场景中尤为明显,很难保持细节。
- 粒子电影是AV1的一个弱点。即使启用了电影颗粒合成,也很难获得满意的结果。以下是目前我们能做的最好的:
SvtAv1EncApp --rc 0 --crf 20 --preset 3 --irefresh-type 1 --keyint 240 --input-depth 10 --enable-overlays 1--enable-tf 0 --enable-restoration 0 --film-grain <整数>
目前(2022年初,SVT-AV1 v0.9.0),它是一个相当有前景但并不完美的编解码器。对于大多数常规内容,它非常好,在小文件大小的情况下实现了高质量,并显然兑现了其比HEVC更高效的承诺。
唯一仍需改进的领域是颗粒感强、细节丰富的电影场景。面对如此高比特率、蓝光质量的源素材,很难实现视觉透明度。如果颗粒合成已经足够好,并且大多数设备都可以顺利解码,那么它可以普遍推荐。目前,它仍然处于晚期实验阶段。