本部分列出了针对各种常见配置的 VP9 编码建议:

  • 针对网站和移动设备(VOD)高度优化的视频
  • 优质内容分发(视频点播)
  • 体育、动画、10 位内容 (VOD)
  • 直播编码
  • WebRTC

简介

在对视频进行编码时,需要考虑以下几个方面:

  • 您是创建单个版本的媒体内容,还是创建多个不同比特率和分辨率的版本?
  • 您要创建的是直播视频流还是点播视频文件?
  • 您要编码的是哪种类型的媒体 - 是否包含大量运动画面?详细信息? 动画?
  • 您是希望以最高质量(例如付费内容)还是最快速度(例如网络会议)进行编码?

本部分首先介绍基本点播视频文件的设置,然后针对上述所有问题提供建议。

基本设置

编码码率

建议将以下比特率作为网页和移动设备分发的基准。这些建议可最大限度地降低比特率,同时实现适合在面向消费者的网站和移动设备上分发的视频画质;您可以将这些建议视为“低”比特率建议,但仍可实现合理的画质。

建议的目标比特率

帧大小/速率 平均比特率(视频点播,kbps) 平均比特率(直播,kbps)
320x240p @ 24、25、30 150 250
640x360p @ 24、25、30 276 386
640x480p @ 24、25、30 512(LQ)、750(MQ) 720 (LQ)、1024 (MQ)
1280x720p @ 24、25、30 1024 1440
1280x720p @ 50、60 1800 2500
1920x1080p @ 24、25、30 1800 2500
1920x1080p @ 50、60 3000 4200
2560x1440p @ 24、25、30 6000 8400
2560x1440p @ 50,60 9000 12600
3840x2160p @ 24、25、30 12000 16800
3840x2160p @ 50、60 18000 25200

图 2a:目标比特率

VOD 编码设置

适用于大多数类型内容的设置

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

我们还建议允许比特率范围为目标值的 50% 到 150%,并使用下表所示的质量值。此模式需要进行双遍编码,建议对 HD 及更高分辨率使用较快的设置,如下所示。

CQ 编码的编码器设置

帧高度 目标质量 (CQ) 编码模式
240 37 TWO_PASS_MEDIUM
360 36 TWO_PASS_MEDIUM
480 34(低质量)或 33(中等质量) TWO_PASS_MEDIUM
720 32 TWO_PASS_FAST
1080 31 TWO_PASS_FAST
1440 24 TWO_PASS_FAST
2160 15 TWO_PASS_FAST

图 2b:CQ 推荐的设置

最后,我们建议在关键帧之间放置 240 帧视频(对于 30fps 的内容,这相当于 8 秒)。关键帧是自给自足的视频帧;它们不依赖于任何其他帧来渲染(有关更详细的说明,请参阅“GOP 结构”)。对于网页和移动设备播放,我们允许在关键帧之间留出充足的间隔,因为这样编码器就可以选择“最佳”关键帧放置位置,从而最大限度地提高质量。

命令行参数示例:640x360 视频

根据上表,360p 视频的建议如下:

  1. CQ 水平为 36(见图 2b)
  2. 目标比特率为 276kbps(见图 2a)
  3. 允许的最低比特率为 138kbps(目标值的 50%)
  4. 允许的最大比特率为 414kbps(目标值的 150%)
  5. 关键帧间隔时间上限为 240 秒
  6. 双遍“中”配置文件

这会为 libvpx 和 FFmpeg 提供以下命令行参数:

libvpx

--end-usage=cq --cq-level=36 --target-bitrate=276 --minsection-pct=50 \
  --maxsection-pct=150 --kf-max-dist=240 --passes=2 --good --cpu-used=2

FFmpeg

-crf 36 -b:v 276k -minrate 138k -maxrate 414k -g 240 -good -speed 2

Premium 内容设置

在上面的示例中,我们使用了相当快的编码设置来高效创建视频流。不过,对于某些内容(例如付费电影),值得在编码期间花费更多时间,以获得更高质量的输出。

对于优质内容,我们建议采用与上述相同的设置,但使用不同的预设,指示编码器花费更多时间来优化质量:

优质内容编码模式和命令行参数

帧高度 编码模式 libvpx FFmpeg
240 TWO_PASS_VERY_SLOW --good --cpu-used 0 -good -speed 0
360 TWO_PASS_VERY_SLOW --good --cpu-used 0 -good -speed 0
480 TWO_PASS_VERY_SLOW --good --cpu-used 0 -good -speed 0
720 TWO_PASS_SLOW --good --cpu-used 1 -good -speed 1
1080 TWO_PASS_MEDIUM --good --cpu-used 2 -good -speed 2
1440 TWO_PASS_MEDIUM --good --cpu-used 2 -good -speed 2
2160 TWO_PASS_MEDIUM --good --cpu-used 2 -good -speed 2

图 2c:优质内容编码模式

体育、高动态内容设置

我们建议对体育内容使用 VBR 编码。体育内容往往具有相当一致的高运动和复杂性,与 QP 编码相比,使用 VBR 在运动较少的时段可实现更高的质量。

对于命令行,QP 模式与 VBR 模式之间的主要区别在于,您无需指定 CQ 级别;否则,建议的设置是相同的。

VBR 命令行参数示例:640x360 视频

libvpx

--end-usage=vbr --target-bitrate=276 --minsection-pct=50 --maxsection-pct=150 \
  --kf-max-dist=240 --passes=2 --good --cpu-used=2

FFmpeg

-b:v 276k -minrate 138k -maxrate 414k -g 240 -good -speed 2

动画和游戏设置

含噪声 / 低质量内容设置

对于噪声较大的内容,我们建议增加替代参考帧的数量和强度。替代参考帧是“不可见”的帧,永远不会向用户显示,但在创建最终帧时会用作参考(您可以在此处阅读更多信息)。

建议使用以下参数来指示 VP9 使用更多替代参考帧:

libvpx

--auto-alt-ref=1 --lag-in-frames-16 --arnr-maxframes=5 --arnr-strength=3

FFmpeg

10 位/HDR 编码

对于 10 位编码,您需要使用 VP9 Profile 2。10 位编码不需要更多位,因此其余参数相同:

libvpx

--profile=2

FFmpeg

-profile 2

直播编码设置

直播

实时编码通常以 CBR 模式完成,这会限制编码器最大限度提高质量的能力。因此,我们将使用更高的比特率,如图 2a 所示。

对于实时编码,我们还希望最大限度地提高线程数。这是通过以下操作实现的:

  1. 允许 VP9 将视频拆分为列(宽度不得小于 256 像素,且必须是 2 的幂);
  2. 指示 VP9 使用更多 CPU 电源。下表列出了针对每种分辨率的建议。

平铺和线程建议

CQ 编码的编码器设置
帧大小 平铺列数 线程数
320x240 1 2
640x360 2 4
640x480 2 4
1280x720 4 8
1920x1080 4 8
2560x1440 8 16
3840x2160 8 16

图 2d。建议的实时编码分块和线程处理

实时编码还会将截止时间设置为“实时”,以确保性能,并指示备用参考帧不要预测未来(这会引入延迟):

由此,我们针对 360p 直播视频给出的建议如下:

  1. CBR,目标比特率为 386kbps(见图 2a)
  2. 2 个图块列(参见图 2d)
  3. 4 个线程(见图 2d)
  4. 实时表现
  5. 没有因交替帧而产生的延迟(没有帧滞后)

这会为 libvpx 和 FFmpeg 提供以下命令行参数:

libvpx

--end-usage=cbr --target-bitrate=386 --cpu-used=4 --tile-columns=2 --rt --lag-in-frames=0

FFmpeg

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -r 29.97 -b:v 386k \
  -minrate 386k -maxrate 386k -c:v libvpx-vp9 -c:a libopus output.webm

DASH/YouTube 的实时 VP9 编码

WebRTC 编码