VP9 码率模式详细介绍

简介

虽然我们在基本编码页面中提供了有关比特率模式的概要信息,但这些信息仅涉及 CQ(受限质量)模式。

本文档详细介绍了其他实用方法,可用于调整 VP9 比特率,以针对各种场景进行优化。以下示例使用 FFmpeg

压缩

VP9 等视频压缩技术旨在减少向最终用户传达清晰图像和运动感所需的数据量。

实现这一目标的关键技术之一是量化。量化器以数学方式简化了图像的各种数字化元素。例如,它可能会减少所用颜色的范围,并进一步对数据执行数学函数,以“平滑”减少的颜色范围内的感知分辨率不足。此类函数有很多。

量化(或“Q”)在 Wikipedia 文章中有详细介绍。

在 VP9 中,量化是对转换系数执行的。通过添加到编码中,这可降低保持感知质量所需的比特率。

最终,当量化程度较高(Q 值较高)时,细节会丢失,质量会降低,但存储帧所需的数据量会减少。在大多数情况下,VP9 编码器会根据每个帧的复杂程度,通过随时间变化而改变量化参数来实现其比特率目标。

应用场景优化

为了让用户能够根据自己的特定需求“调整”VP9 压缩,可以通过多个编程接口在初始压缩时调整质量和比特率的平衡。

编码器可在速度、质量和比特率之间进行灵活的权衡取舍。

  • 如果用户注重质量,则必须准备好应对更长的编码时间,或者提供更快、更充足的处理资源。

  • 如果用户专注于确保输出的 VP9 编码文件较小且可以快速交付,则必须准备好减少量化器处理图像的时间,这将导致量化器可以处理的细节程度降低。

  • 如果用户纯粹注重传输速度(例如在网络直播或双向视频会议中),那么量化可能完全受限于网络上可传输的可用数据字节速率(即“比特率”)。

正确的选择将高度取决于每个使用情形。为了更轻松地根据您的使用场景调整此平衡,VP9 支持四种“比特率模式”,可进行简单明了的配置。

VP9 比特率模式

我们先来看看 VP9 支持的主要比特率模式:

模式
恒定量化器 (Q) 允许您指定固定的量化器值;比特率会有所不同
受限质量 (CQ) 允许您设置最高质量级别。质量可能会在比特率参数范围内变化
可变比特率 (VBR) 在码率限制范围内,随时间推移平衡质量和码率
恒定比特率 (CBR) 尝试保持比特率相对恒定,同时质量有所变化

Q

Q 模式图表

在文件大小和比特率完全从属于最终质量的场景中,恒定量化器模式是一个不错的选择。

Q 设置的应用场景可能包括数字影院、数字编辑室或数字标牌应用,在这些场景中,内容可以通过实体存储介质或在不受限制的时间内(在实际使用内容之前很久)进行交付,并且所需的输出必须具有最高的视觉质量。

VP9 Q 模式码率优化

恒定量化器模式所需的配置最少。顾名思义,Q 模式侧重于将量化器保持在目标“质量”水平,并允许量化器确定要处理的数据流。用户只需定义目标质量。

如需详细了解以图片处理为重点(而非以比特率为重点)的目标质量,请参阅基本编码一文。

使用以下 FFmpeg 命令行参数进行 Q 模式比特率优化:

ffmpeg
-b:v 0 通过将视频比特率标记为 0,我们明确设置了“Q”模式
-g <arg> 设置关键帧间隔(以帧为单位,默认值为 240)
-crf <arg> 设置最高质量级别。有效值为 0-63。数字越小,质量越高
-quality good -speed 0 这是大多数应用的默认设置,也是推荐的设置。best 更像是一款研究工具,与 -quality good -speed 0 相比,改进幅度不大
-lossless 无损模式

Q 模式比特率:FFmpeg 示例

第一个示例是极端的 Q 模式设置,仅用于说明。(即使处理这些示例中的 120 秒片段也需要数小时,并且生成的输出文件通常比原始来源大得多。)

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 1 -b:v 0 -crf 0 -quality good \
  -speed 0 -lossless 1 -c:a libvorbis Q_g_1_crf_0_120s_tears_of_steel_1080p.webm.webm

为了比较 -crf 的效果,以下示例仅更改了 -crf。请注意,-g 未定义,因此将默认为 240,而实际上 -crf 默认为 10,因此即使不在三个示例中的第二个示例中添加这两个参数,我们也会得到相同的结果:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 0 -quality good \
  -speed 0 -c:a libvorbis Q_crf_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -c:a libvorbis Q_crf_10_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 63 -quality good \
  -speed 0 -c:a libvorbis Q_crf_63_120s_tears_of_steel_1080p.webm

这些示例的输出在磁盘上占用的空间大小不同。当 -crf 设置为 0 时,文件大小为 711.8MB;当 -crf 设置为 10 时,文件大小为 125.3MB;当 -crf 设置为 63 时,文件大小为 4.5MB。简单来说,这表明我们通过提高 -crf 实参的值降低了生成的 VP9 编码文件的质量。所有输出文件的完整摘要见下方的“结果表”。

现在,我们来比较一下更改 -g 设置的效果。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 1 -b:v 0 -quality good \
  -speed 0  -c:a libvorbis Q_g_1_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 240 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_240_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 480 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_480_120s_tears_of_steel_1080p.webm

我们注意到,-g 1 设置会生成一个非常大的文件,大小为 25.9MB。相比之下,如果将 -g 240 更改为 -g 480(明确设置为与默认值相同),最终会得到一个 4.4MB 的文件。

CQ

CQ 是基于文件的视频的推荐模式。

CQ 模式图表

对于大多数内容类型,我们建议使用受限质量 (CQ) 模式,并设置比特率上限。大多数视频都包含高运动场景(例如动作序列)和细节较少的场景(例如对话)。在 CQ 模式下,编码器可以在较长、较简单的场景中保持合理的质量水平(不会浪费比特),同时为复杂的序列分配更多比特。

不过,我们仍必须通过提供上限范围来限制该流程,否则可能根本不会进行压缩!我们还可以设置较低的范围,这样即使图像是黑色的,编码过程几乎没有要做的事情,我们仍然会处理该数据,虽然效率可能不如我们预期的那么高,但最终结果是即使是黑色也不会被大幅压缩,看起来“非常黑”。

此外,我们还必须设置量化器阈值。在 VP9 中,量化器阈值可以从 0 变化到 63

以下 FFmpeg 命令行参数用于 CQ 模式:
ffmpeg
-b:v <arg> 设置目标比特率(例如 500k)
-minrate <arg>
-maxrate <arg>
设置最小和最大比特率。
-crf <arg> 设置最高质量级别。有效值为 063,数值越低质量越高。
CQ 比特率模式:FFmpeg 示例

第一个示例提供了一个相当宽泛的约束。不过,与上面针对 Q 给出的示例相比,我们发现这会将比特率强制提高到更高的范围,并且输出质量明显更高。文件大小明显更大。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1000k -maxrate 4000k -crf 10  -c:a libvorbis \
  CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm

在此实例中,输出文件在磁盘上占用的空间为 20.2MB,明显小于上述示例中的 Q 模式编码。

相比之下,在下一个示例中,我们将比特率限制在一个更明确的范围内。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10  -c:a libvorbis \
  CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm

在此示例中,输出文件大小为 24.1MB,与上一个示例相比,在复杂度和运动程度较高时,视频质量明显降低。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 1000k \
  -minrate 750k -maxrate 1400k -crf 10  -c:a libvorbis \
  CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm

在此最终示例中,输出的大小显著减小,磁盘上的大小降至 13.2MB。

VBR

建议对包含高运动量内容(例如体育赛事)的流式视频点播文件使用可变比特率模式 (VBR)。它非常适合基于 HTTP 的交付。

VBR 模式图表

在 VBR 模型中,动作场景的编码比特率可能高于与关键帧一致的“简单”场景。

对于大型流式传输交付模型,VBR 在分发和基础设施方面带来的好处非常显著。当同一基础架构传送许多 VBR 流时,使用该系统的所有观看者都可以受益。

此外,还建议使用 VP9 VBR 对运动和其他高动态内容进行编码。对于此类高复杂度的内容,VBR 在运动较少的时段可实现更高的质量。

以下 FFmpeg 命令行参数用于 VBR 模式:
ffmpeg
-quality good good 画质适合视频点播
-speed <arg> 对于视频点播,有效值为 0-5,其中 0 为最高画质,5 为最低画质。(对于直播,范围为 5-9 - 请参阅下文中的 CBR)
VBR 比特率模式:FFmpeg 示例
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 0  -c:a libvorbis \
  VBR_good_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5  -c:a libvorbis \
  VBR_good_5_120s_tears_of_steel_1080p.webm

CBR

建议在进行 VP9 直播时使用恒定比特率模式 (CBR)。

CBR 模式图表

CBR 实际上将比特率上限设置为“硬性上限”。这意味着编码过程无法以网络无法承载的速率生成数据。

例如,对于实时通信(视频会议)流,编码应用不应向网络发送超出其承载能力的数据,这一点非常重要。如果出现这种情况,音频/视频同步问题或卡顿的帧会严重影响用户体验,比压缩效率降低的影响更大。通过确保定义了硬上限,VP9 将在达到该上限时降低质量。

以下 FFmpeg 命令行参数用于 CBR 模式:
ffmpeg
-quality realtime realtime 画质适合直播
-speed <arg> 对于直播,有效值为 5 到 9,其中 5 为最高质量,9 为最低质量。(对于视频点播,这些值介于 0 到 5 之间。请参阅上文中的“VBR”部分。)
-minrate <arg>
-maxrate <arg>
设置最小和最大比特率 ** 对于 CBR 模式,这两个值必须设置为相同的 -b:v 比特率值**。

简单来说,我们将目标比特率、最低比特率和最高比特率固定为相同的值,并告知量化器相关操作对时间敏感。

CBR 比特率模式:FFmpeg 示例

以下示例探讨了如何将比特率设置为 2Mbps 和 500kbps 目标值:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
  CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 8 -c:a libvorbis \
  CBR_2000_realtime__8_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
  CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
  CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm

结果

上述每项编码都是在具有以下规格的 Ubuntu Linux 系统上执行的:

  • 处理器:4 个 Intel(R) Core(TM) i5-6500 CPU (3.20GHz)
  • 内存 (RAM):8060MB(已用 1492MB)
  • 显卡:Intel HD Graphics 530 (Skylake GT2)
  • 操作系统:Ubuntu 16.04 LTS

在所有情况下,源文件都是从《钢之泪》中剪辑的 1 分 20 秒 (1:20) 的短片

文件 编码分钟数 磁盘上的文件大小
Q_g_1_crf_0_120s_tears_of_steel_1080p.webm 81 1.06GB
Q_crf_0_120s_tears_of_steel_1080p.webm 131 711.8MB
Q_crf_10_120s_tears_of_steel_1080p.webm 118 125.3MB
Q_crf_63_120s_tears_of_steel_1080p.webm 27 4.5MB
Q_g_1_120s_tears_of_steel_1080p.webm 51 25.9MB
Q_g_240_120s_tears_of_steel_1080p.webm 28 4.5MB
Q_g_480_120s_tears_of_steel_1080p.webm 10 4.4MB
CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm 11 20.2MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24.1MB
CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm 50 13.2MB
VBR_good_0_120s_tears_of_steel_1080p.webm 3 23.4MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23.9MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 2 24.8MB
CBR_2000_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 21MB
CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 8.5MB
CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 7.1MB

值得注意的是,将 -speed 值设置为高于 5 会改变 VP9 处理速度。虽然量化程度大幅增加(从极低质量的快速比特率中强烈的“抖动”效果可以看出),但 VP9 仍然能够生成非常出色的低比特率 1080p 输出,尽管它更适合小型移动设备,而不是大型显示屏。

重新缩放(调整大小)用例的注意事项

VP9 的比特率模式显然不是孤立的,可以与其他许多实参和形参结合使用,以专门针对特定使用场景。一个典型的使用情形可能是重新调整输出视频的尺寸,以定位到特定设备。

一个经典示例是将高清视频流更改为标清输出。同样,这会对处理时间和输出比特率产生重大影响。在两个 FFmpeg 命令完全相同的情况下,仅仅调整输出视频的大小就会改变生成的文件的大小,以及流式传输模型中的比特率。

为了举例说明这一点,我们从每种比特率模式中选择了一个中点示例,并简单地添加了重新缩放参数。

Q 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -vf scale=640x480 -c:a libvorbis 640x480_Q_crf_10_120s_tears_of_steel_1080p.webm
CQ 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
VBR 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

重新缩放的结果表

文件 编码分钟数 磁盘上的文件大小
640x480_Q_crf_10_120s_tears_of_steel_1080p.webm 5 3.4MB
640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm 2 22.4MB
640x480_VBR_good_5_120s_tears_of_steel_1080p.webm 1 22.6MB
640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm 4 23MB

为了便于比较,这些命令与我们之前示例中的 FFmpeg 命令相同,但没有缩放功能:

文件 编码分钟数 磁盘上的文件大小
Q_crf_10_120s_tears_of_steel_1080p.webm 56 126MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24.1MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23.9MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 24.8MB

您会看到,每种模式的输出文件大小都有显著减小,并且虽然在大多数示例中编码时间有所减少,但在 Q 模式下,编码时间实际上有所增加。“更”压缩视频需要更多精力,因此即使在不受质量限制的情况下(如在 Q 模式下),输出文件的大小预计会更小,但实际上生成输出文件所需的时间可能会更长。请勿认为编码过程始终可以更快地传送较小的文件。

重新缩放,同时降低比特率

作为最终比较,以下示例重新运行了 CQ、VBR 和 CBR 的缩放示例,但这次我们将目标比特率限制为 500kbps 的水平,大约是原来的四分之一(与图像尺寸的缩小比例一致)。

CQ 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 350k -maxrate 550k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
VBR 模式
ffmpeg -i "120s_tears_of_steel_1080p.webm" -c:v libvpx-vp9 -b:v 500k \
  -minrate 350k -maxrate 500k -quality good -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

调整分辨率和降低目标比特率的结果表

文件 编码分钟数 磁盘上的文件大小
640x480_CQ_500_crf_0_120s_tears_of_steel_1080p.webm 1 7MB
640x480_VBR_500_good_5_120s_tears_of_steel_1080p.webm 1 7MB
640x480_CBR_500_realtime_5_120s_tears_of_steel_1080p.webm 1 7.6MB

可以看到,编码时间进一步缩短。