skip to content
Logo 三七の小站

SVT-AV1 编码指南

/ 7 min read

源链接: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 medium6类似于x265 slow

每个步骤的编码时间变化很大。以下是一些快速测试的结果,使用的是30秒、1080p、24 fps的电影片段,启用了颗粒合成(不具代表性)。

预设编码时间 / s文件大小 / MB
378110.4
434010.6
523110.6
614610.8
711510.9
810910.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更高效的承诺。

唯一仍需改进的领域是颗粒感强、细节丰富的电影场景。面对如此高比特率、蓝光质量的源素材,很难实现视觉透明度。如果颗粒合成已经足够好,并且大多数设备都可以顺利解码,那么它可以普遍推荐。目前,它仍然处于晚期实验阶段。

脚注:

  1. https://aomedia.googlesource.com/aom/

  2. https://investors.vimeo.com/news-releases/news-release-details/vimeo-introduces-support-royalty-free-video-codec-av1

  3. https://github.com/staxrip/staxrip

  4. https://github.com/Alkl58/NotEnoughAV1Encodes

  5. https://github.com/n00mkrad/nmkoder