2024-02-24更新。

草稿

AV1是由非营利性行业联盟开放媒体联盟(AOMedia)开发的一个开源且无版税的视频编解码器。根据不同的使用场景,AV1相比于VP9可以实现大约30%的更高压缩效率,与H.264相比可以达到大约50%的更高效率。目前有三种AV1编码器被FFmpeg支持:libaom(在FFmpeg中使用libaom-av1调用)、SVT-AV1(libsvtav1)、以及rav1e(librav1e)。本指南目前主要关注libaom和SVT-AV1。

笔记
libaom

libaom(libaom-av1)是AV1格式的参考编码器。它也在AV1开发期间用于研究。libaom基于libvpx,因此在功能、性能和使用方面与之有很多共同点。要安装支持libaom-av1的FFmpeg,请查看编译指南,并在编译FFmpeg时加上—​enable-libaom选项。libaom提供了以下码率控制模式,这些模式决定了获得的质量和文件大小:恒定质量、限制质量、2-pass平均比特率、1-pass平均比特率。要获取选项列表,请运行ffmpeg -h encoder=libaom-av1 或查阅FFmpeg的在线文档。对于可以通过-aom-params传递的选项,推荐查看aomenc应用程序的—​help输出,因为目前还没有官方的在线参考资料。

注意:使用早于2.0.0版本的libaom用户需要添加命令 -strict experimental(或别名 -strict -2)。

恒定质量

libaom-av1具有恒定质量(CQ)模式(类似于x264和x265中的CRF),它将确保每一帧都能得到其应得的位数以达到一定的(感知)质量水平,而不是编码每一帧来满足比特率目标。这样可以获得更好的整体质量。如果您不需要达到固定的目标文件大小,这应该是您的首选方法。要触发此模式,只需使用-crf开关,并输入所需的数值即可。

笔记
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 av1_test.mkv

CRF值可以从0到63变化。较低的值意味着更好的质量和更大的文件大小。0意味着无损。CRF值为23时,其质量水平相当于x264(来源)的CRF 19,这将被认为是视觉上无损的。请注意,在4.3版本之前的FFmpeg版本中,触发CRF模式还需要将比特率设置为0,即使用-b:v 0。如果不这么做,那么-crf开关将触发受限质量模式,并且默认比特率为256kbps。

受限质量

libaom-av1也有一个受限质量(CQ)模式,它将确保在将比特率保持在一个指定的上限或在一定范围内的同时,达到一个恒定的(感知)质量。这种方法对于以大体一致的方式批量编码视频很有用。

笔记
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 2000k output.mkv

质量由 -crf 决定,而比特率限制由 -b:v 决定,其中比特率必须非零。您也可以指定一个最小和最大比特率,而不是质量目标:

笔记
ffmpeg -i input.mp4 -c:v libaom-av1 -minrate 500k -b:v 2000k -maxrate 2500k o

注意:在将内容复合(muxing)进MP4格式时,如果预期的文件用途是流媒体的话,你可能会希望在输出参数中添加 -movflags +faststart。

双遍算法

为了在特定目标比特率下创建更高效的编码,你应该选择双遍编码。当使用恒定质量而没有目标比特率时,双遍编码对编码效率也有益。对于双遍,你需要运行两次ffmpeg,并且设置几乎相同,除了:在第一遍和第二遍中,分别使用-pass 1和-pass 2选项。在第一遍中,输出到一个空的文件描述符,而不是一个实际的文件。(这将生成FFmpeg在第二遍需要的日志文件。)在第一遍中,你可以通过指定-an来省略音频。

笔记
ffmpeg -i input.mp4 -c:v libaom-av1 -b:v 2M -pass 1 -an -f null /dev/null && ffmpeg -i input.mp4 -c:v libaom-av1 -b:v 2M -pass 2 -c:a libopus output.mkv

注意:Windows 用户应该使用 NUL 而不是 /dev/null,并且使用 ^ 代替 \ 。

平均比特率

libaom-av1还提供了一个简单的“平均比特率”或“目标比特率”模式。在这种模式下,它将简单地试图达到指定的平均比特率,例如2 MBit/s。

笔记
ffmpeg -i input.mp4 -c:v libaom-av1 -b:v 2M output.mkv

仅在文件大小和编码时间比单独的质量更重要时使用此选项。否则,请使用上文描述的其他码率控制方法之一。

控制速度 / 质量

-cpu-used 设置了压缩的效率。默认值为1。较低的值意味着更慢的编码速度和更好的质量,反之亦然。有效值范围是0到8(包含0和8)。-row-mt 1 启用基于行的多线程,这最大化了CPU的使用。为了实现快速解码性能,还可以添加tiles(即-tiles 4x1或-tiles 2x2来获得4个tiles)。当CPU的线程数多于编码的tiles数量时,启用row-mt才会更快。-usage realtime 激活实时模式,用于实时编码的使用场景(如直播、视频会议等)。-cpu-used 在7-10之间的值只有在实时模式下才可用(尽管由于FFmpeg中的一个bug,通过FFmpeg不能使用高于8的预设值)。

关键帧放置

默认情况下,libaom的最大关键帧间隔是9999帧。这可能导致在搜索时速度较慢,特别是在内容中场景变化少或不频繁的情况下。可以使用-g选项来设置最大关键帧间隔。对于大多数内容来说,最多10秒被认为是合理的,所以对于每秒30帧的内容可以使用-g 300,对于每秒60帧的内容可以使用-g 600,等等。要设置固定的关键帧间隔,将-g和-keyint_min设置为相同的值。注意,目前-keyint_min会被忽略,除非它与-g值相同,所以无法单独设置最小关键帧间隔。对于只输出帧内编码的内容,使用-g 0。

HDR 和高位深度

在HDR编码时,必须传递颜色信息;色彩空间、色调特性以及色彩基色。例如,Youtube HDR使用。

笔记
-colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020

AV1在其主要配置文件中包括了10位支持。因此,内容可以以10位编码,而不必担心与硬件解码器不兼容。要在主要配置文件中使用10位,可以使用 -pix_fmt yuv420p10le。要使用4:4:4色度子采样的10位(需要高级配置文件),可以使用 -pix_fmt yuv444p10le。12位也得到了支持,但需要专业配置文件。有关支持的像素格式,请参阅ffmpeg命令 ffmpeg -help encoder=libaom-av1。

无损编码

使用-crf 0实现无损编码。由于FFmpeg 4.4版本之前存在一个bug,第一帧将不会被无损保存(该问题已在2021年3月21日修复)。作为在4.4之前版本的一种解决方法,可以使用-aomparams lossless=1来实现无损输出。

笔记
SVT-AV1

SVT-AV1(libsvtav1)是由英特尔与Netflix共同开发的编码器。在2020年,SVT-AV1被AOMedia采纳,成为未来AV1开发以及未来编码工作的基础。该编码器支持广泛的速度-效率折中,并能在许多CPU核心上相当好地扩展。要启用支持,需要使用 --enable-libsvtav1 来构建FFmpeg。关于在你的特定FFmpeg构建中可用的选项,参见 ffmpeg -help encoder=libsvtav1。另请参见FFmpeg文档、上游编码器用户指南及所有参数列表。许多选项通过 -svtav1-params 传递给编码器。这在SVT-AV1 0.9.1中引入,并且自FFmpeg 5.1起得到支持。CRF是默认的码率控制方法,但也支持VBR和CBR。

笔记
CRF

就像x264和x265中的CRF一样,这种码率控制方法试图确保每一帧都获得它应得的比特数以达到一定的(感知的)质量水平。例如:

笔记
ffmpeg -i input.mp4 -c:v libsvtav1 -crf 35 svtav1_test.mp4

请注意,-crf 选项只在 2022-0224 之后的 FFmpeg git 版本中支持。在此之前的版本中,CRF 值是通过 -qp 设置的。CRF 有效值范围为 0-63,其中默认值为 30。较低的值对应较高的质量和较大的文件大小。目前还不支持无损编码。对于 4k-8k 分辨率的源文件,CRF 设置为 38 通常足以达到至少 95% 的 VMAF 和足够好的 PSNR。获取更多信息,对于 1080p 和 720p 的源文件,av1 优化并不是最佳选择,大多数情况下使用 H265 以获得更好的 vmaf/size 比例会更好。要检查 vmaf、ssim、psnr 请查看 ffmetrics。

预设和调音

编码速度与压缩效率之间的权衡通过-preset选项来管理。自从SVT-AV1 0.9.0起,支持的预设范围从0到13,较高的数字提供更高的编码速度。注意,预设13仅用于调试和快速凸包编码。在0.9.0版本之前,有效的预设是0到8。作为一个示例,此命令使用预设8和CRF值为35来编码视频,同时复制音频:

笔记
ffmpeg -i input.mp4 -c:a copy -c:v libsvtav1 -preset 8 -crf 35 svtav1_test.mp

从SVT-AV1 0.9.1版本开始,编码器也支持针对视觉质量(锐度)的调优。这可以通过-svtav1-params tune=0来调用。默认值是1,它会调整编码器以优化PSNR。自0.9.1版本以来,还支持调整编码器以产生比特流,这些比特流解码起来更快(对CPU的要求更少),类似于x264和x265中的fastdecode调优。从SVT-AV1 1.0.0版本开始,此功能通过-svtav1-params fastdecode=1来调用。在0.9.1版本中,该选项接受从1到3的整数,数字越大,生成的视频越易于解码。在0.9.1版本中,解码器调优只支持从预设5到10的设定,并且不同预设之间的解码器调优级别有所不同。

关键帧放置

默认情况下,SVT-AV1的关键帧间隔是2-3秒,这对大多数使用场景来说相当短。考虑使用-g选项(或在svtav1-params中的keyint)将这个时间增加到5秒(或更长);对于24fps的内容,使用-g 120,对于30fps的内容,使用-g 150,等等。需要注意的是,截至1.2.1版本,SVT-AV1不支持在场景变化时插入关键帧。相反,关键帧被设定在固定间隔处放置。在SVT-AV1 0.9.1及以前的版本中,这项功能虽然存在,但被认为状态不佳,因此默认是关闭的。

电影颗粒合成

SVT-AV1支持电影颗粒合成,这是一种AV1特性,用于在花费极少的比特率的情况下保持视频的颗粒质感。首先通过降噪技术移除图像中的颗粒,然后近似模拟并合成颗粒,最后在解码时作为过滤器添加到视频上。电影颗粒合成特性可以通过-svtav1-params film-grain=X调用,其中X是从1到50的整数。高数字对应更高级别的降噪处理,因此合成更多的颗粒。颗粒降噪过程也可能会移除细节,特别是在为了保持非常颗粒质感的电影外观所需的高数值时。这可以通过设置film-grain-denoise=0来减轻,该选项通过svtav1-params传递。尽管默认情况下,经过降噪的帧会被传递去编码为最终画面(film-grain-denoise=1),关闭该选项将会使用原始帧代替。

笔记
rav1e

librav1e 是 Xiph 组织为 AV1 编码所开发的编码器。编译时使用 --enable-librav1e 参数。具体详情请参考 FFmpeg 文档及上游命令行选项。Rav1e 宣称自己是最快的 AV1 软件编码器,但这实际上取决于设置。

笔记
AMD AMF AV1

高级媒体框架(AMF)为开发者提供了最佳的访问AMD GPU的方式,用于多媒体处理。AMD AMF AV1编码器是一款专业的视频编码器,提供强大的视频编码能力和广泛的自定义选项。它旨在满足不同用户的个别需求。用户可以调整编码器的参数设置来满足不同的编码要求,例如分辨率、比特率、帧率、编码质量等等。这些参数设置可以根据用户的需要进行自定义,以满足不同的视频编码情景和设备要求。

视频编码器平衡了速度、质量和延迟等因素。AMD已经将几种典型的用户使用情景预设集成到AMF编码器中。用户可以通过设置“usage”(使用情景)参数来使用这些预设。使用情景参数支持典型的应用场景,包括:转码:在带宽受限的网络环境中,将高分辨率或高比特率的视频转换为低分辨率或低比特率的视频,用于传输或存储。低延迟:对于视频实时流应用,要求更低的延迟和更高的视频质量。针对每一种使用情况,AMF都根据相应的场景优化和预设了编码器的参数。这些参数优化和预设涵盖了大多数参数,包括但不限于:编码配置文件和水平,GOP大小和结构,速率控制模式和策略,运动估计方法和精度,多遍编码,去块滤波器强度,自适应量化和速率失真优化,比特率和分辨率约束。通过使用这些预设,用户可以轻松高效地选择适合其特定使用场景的编码设置,无需对编码器的参数及其对视频质量和性能的影响有深入了解。转码的使用场景。

笔记
ffmpeg -s 1920x1080 -pix_fmt yuv420p -i input.yuv -c:v h264_amf -usage transc

低延迟的使用场景

笔记
ffmpeg -s 1920x1080 -pix_fmt yuv420p -i input.yuv -c:v av1_amf -usage lowlate
笔记
Usage

这个参数用于在视频质量和速度之间进行选择。这个参数对编码速度有显著的影响。它有三个有效值: 质量:这个预设为高质量视频输出优化,适合于视频制作、广播和实时流媒体等应用。 平衡:这个预设在质量和速度之间取得平衡,适合于需要在两者之间平衡的各种应用,如视频会议和在线游戏。 速度:这个预设优先考虑速度而非质量,适合于需要实时视频编码和低延迟的应用,如在线游戏和远程桌面应用。

笔记
ffmpeg -i input.mp4 -c:v av1_amf -quality balanced output.mp4 ffmpeg -i input.mp4 -c:v av1_amf -quality quality output.mp4 ffmpeg -i input.mp4 -c:v av1_amf -quality speed output.mp4
笔记
Enforce_hrd
笔记
Quality

假设参考解码器(HRD)有助于防止缓冲区溢出和下溢,这可能会导致视频播放中的卡顿或冻结等问题。HRD可能需要牺牲一定程度的图像质量。"enforce_hrd" 参数并不总是对所有类型的场景都是必要或适当的。应该有选择性地使用,并仔细考虑所编码视频内容的具体特征。

笔记
ffmpeg -i input.mp4 -c:v av1_amf -enforce_hrd true output.mp4
笔记
Vbaq

VBAQ是一种用于提高编码视频视觉质量的技术。它通过基于内容的视觉复杂性调整块的量化参数来实现这一点。对于编码视觉内容复杂的视频,如高运动或高细节场景,这种技术特别有效。

笔记
ffmpeg -i input.mp4 -c:v av1_amf -vbaq true output.mp4
笔记
Align

AV1比特流规范不包含裁剪信息,解码器无法显示特定的、像素精确的分辨率。预期适当的裁剪信息应该在容器中呈现。AMF AV1编码器引入了参数“align”来满足硬件对齐的要求,以便编码后的比特流可以被正确解码和展示。“align”参数的设定值:

64x16:那些分辨率符合64x16的输入视频将被编码;不符合64x16分辨率的输入视频将不会被编码;其他所有分辨率的视频都不支持。1080p:分辨率符合64x16的输入视频以及1920x1080的视频将被编码;其他所有分辨率的视频都不支持。注意对于1920x1080的分辨率,输出视频的分辨率将是1920x1082。视频帧底部将额外填充两行黑色像素。无:任何分辨率的视频都可以被编码。然而,对于那些非64x16对齐的分辨率视频,它们的输出分辨率将被外推至64x16对齐,并用黑色像素填充。1080p分辨率的视频除外,像“1080p”值所述,将被填充至1082p。

笔记
ffmpeg -i input.mp4 -c:v av1_amf -align 1080p output.mp4

关键帧放置

默认情况下,AMF AV1的关键帧间隔为250帧,这是一个平衡值,适用于大多数用例。可以使用“-g”选项来设置关键帧间隔。例如,在广播电视应用中,通常希望有一个舒适的频道切换时间,以便提供良好的用户体验。2秒钟一个关键帧是作为此目的的普遍设置。因此,对于每秒30帧的内容,可以使用命令“-g 60”。

笔记
ffmpeg -i input.mp4 -c:v av1_amf -g 60 output.mp4