VP9 比特率模式详细信息

简介

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

本文档详细介绍了您可以自定义 VP9 比特率的其他实用方式,以针对各种情况进行优化。下面的示例使用的是 FFmpeg

压缩

VP9 等视频压缩技术旨在减少为最终用户呈现清晰的画面和运动感所需的数据量。

量化是实现这一目标的关键方法之一。量化器从数学上简化了图像的各种数字化元素。例如,这可能会缩小所用的颜色范围,而且可能会进一步对数据执行数学函数,以“平滑”平滑的色彩范围降低时感知到的细微分辨率缺失。有很多这样的函数。

其 Wikipedia 文章中对量化(或“Q”)进行了简要说明。

在 VP9 中,对转换系数执行量化。这样就能增加编码量,从而减少保持感知质量所需的比特率。

最终,当量化(Q 值越高)时,细节会丢失,质量也会降低,但存储帧所需的数据会更少。在大多数情况下,VP9 编码器会根据帧的复杂程度随时间改变 Q 的比特率目标。

用例优化

为了让用户能够根据具体需求“调谐”VP9 压缩,可以通过多种编程接口在初始压缩时调整质量和比特率。

编码器可以在速度、画质和码率之间做出权衡。

  • 如果用户关注质量,他们必须准备好编码时间更长,或者提供更快、更丰富的处理资源。

  • 如果用户的关注点是确保输出 VP9 编码文件较小且可以快速传送,那么他们必须准备缩短量化器处理图片的时间,这将使量化器能够处理的细节降低。

  • 如果用户完全专注于传送速度(例如,在直播网络直播或双向视频会议中),量化可能完全不局限于可以通过网络传输可用数据速率的速率(即,“比特率”)。

正确的选择会因具体的使用情形而异。为了更轻松地根据您的使用场景调整这种平衡,VP9 支持在四种“比特率模式”下进行直接配置。

VP9 比特率模式

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

模式
常量量子 (Q) 允许您指定固定的量化值;比特率会有所不同
约束质量 (CQ) 允许您设置最高质量级别。比特率参数可能因质量而异
可变比特率 (VBR) 在比特率限制期间平衡画质和比特率
恒定比特率 (CBR) 尝试在比特率各不相同的情况下保持比特率相当稳定

问:

Q 模式图表

如果对文件大小和比特率存有疑虑,它们完全不考虑最终质量,那么常量量子模式是不错的选择。

在数字电影院、数字编辑套件或数字标牌应用中,可以发现 Q 设置的用例,其中,内容可以在实体存储媒介上或不受限的时间传送,远远早于实际使用的内容,并且所需的输出必须具有最高的视觉质量。

VP9 Q 模式比特率优化

常量量子模式需要的配置极少。顾名思义,Q 模式侧重于将量化器保持在目标“质量”级别,并让量化器确定它希望处理的数据流。用户需要的只是目标质量。

如需详细了解图像处理目标(而非比特率焦点)目标质量方面的详细信息,请参阅基本编码一文。

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

MPMPG
-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 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 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 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 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 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 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 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(明确设置为与默认值相同)而最终文件为 4.5MB,而 -g 480 最终文件为 4.4MB。

质量得分

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

CQ 模式图表

对于大多数内容类型,我们建议使用限制比特率 (CQ) 模式并采用比特率上限。大多数视频都包含高动态场景(例如动作序列)和细节较少的场景(例如对话)。借助 CQ 模式,编码器可以在更长、更轻松的场景(不浪费位)内保持合理的质量级别,同时为难过的序列分配更多位。

不过,我们仍必须通过提供上下限来约束该过程,否则也可能根本无法压缩!我们还可以设置较低的范围,即使图片是黑色的,编码过程几乎没有任何操作,我们仍会吞吐该数据,可能比我们效率要低,但最终结果是,即使黑色也不会显著压缩,看起来很“黑色”。

此外,您还必须设置量化阈值。在 VP9 中,量化阈值可以从 063 不等。

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

第一个示例给出了一个相当宽的限制。然而,与上面针对 Q 的示例相比,我们发现这会将比特率强制提高到较高范围内,并且输出质量也会明显更高。文件大小尤为明显。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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.2 MB,明显小于上例中的 Q 模式编码。

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

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 vp9  -b:v 1000k \
  -minrate 750k -maxrate 1400k -crf 10  -c:a libvorbis \
  CQ_1400_750_crf_10_120s_tears_of_steel_1080pp.webm

在最后这个示例中,输出的大小显著减小,到磁盘下降到 13.2MB。

VBR

如果要流式传输高动态内容(例如体育类)的视频点播文件,建议使用可变比特率模式 (VBR)。它非常适合基于 HTTP 的分发。

VBR 模式图表

在 VBR 模型中,动作场景的编码可能比“简单”场景更高,它们与关键帧保持一致。

对于大型流式传输传送模型,VBR 优势在分发和基础架构方面都可能会显著增加。当许多 VBR 流由同一基础架构提供时,这可以为使用系统的所有观看者带来好处。

此外,建议使用 VP9 VBR 对包含高运动量的体育和其他内容进行编码。对于这种高度复杂的内容,VBR 在动作较少时可实现较高的质量。

以下 FFmpeg 命令行参数用于 VBR 模式:
MPMPG
-quality good 如果存在此属性,FFmpeg 会将后续的 -speed 设置考虑在内
-speed <arg> 对于 VIDEO ON DEMAND 而言,有效值为 0 - 4,0 代表最高质量,4 代表最低质量。(对于直播范围,范围为 5-8 - 请参阅下面的 CBR)
VBR 比特率模式:FFmpeg 示例
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5  -c:a libvorbis \
  VBR_good_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 8  -c:a libvorbis \
  VBR_good_8_120s_tears_of_steel_1080pp.webm

CBR

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

CBR 模式图表

CBR 基本上会将高比特率设为“硬天花板”。这意味着编码过程无法以网络无法承载的速率生成数据。

例如,对于实时通信(视频会议)视频流,务必要确保编码应用不会向网络发送过多超出其承受范围的数据。否则,音频/视频同步问题或冻结帧会严重影响用户体验,比压缩效率低得多。通过确保定义硬性上限,VP9 会在达到上限后降低质量。

以下 FFmpeg 命令行参数用于 CBR 模式:
MPMPG
-quality realtime 如果存在此属性,FFmpeg 会将后续的 -speed 设置考虑在内
-speed <arg> 对于直播,有效值为 5 到 8,其中 5 代表最高质量,8 代表最低质量。(对于视频点播,此值为 0 到 4。请参阅上面的 VBR。)
-minrate <arg>
-maxrate <arg>
设置最小和最大比特率 ** 对于 CBR 模式,必须将这些比特率设为相同的 -b:v 比特率** .

非常简单,我们将目标比特率、最小比特率和最大比特率都修复为相同的值,并告知量化器操作是时间敏感型。

CBR 比特率模式:FFmpeg 示例

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

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 0 -c:a libvorbis \
  CBR_2000_realtime_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
  CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 0 -c:a libvorbis \
  CBR_500_realtime__0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
  CBR_500_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
  CBR_500_realtime_8_120s_tears_of_steel_1080p.webm

成果

上述每个编码都按下列规范在 Ubuntu Linux 系统上执行:

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

在所有情况下,源文件都是从 Tears Of Steel 挑选的一分二十二十秒 (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
VBR_good_8_120s_tears_of_steel_1080p.webm 1 23.9MB
CBR_2000_realtime_speed_0_120s_tears_of_steel_1080p.webm 98 21MB
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_0_120s_tears_of_steel_1080p.webm 73 6.2MB
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 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 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 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 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 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 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 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

如您所见,编码时间进一步缩短。