用途

本部分针对执行基于文件的编码(即非实时编码)时 VP9 编码设置提供建议。

这些建议旨在实现以下目标:

  • 在质量和编码速度之间取得平衡
  • 实现合理质量所需的最低比特率
  • 可适应各种内容类型的设置

这些建议不会:

  • 解决直播编码问题
  • 针对特定内容类型(例如高运动量的体育赛事画面)进行优化
  • 根据特定设备或网络要求配置设置

单分辨率编码

VP9 支持各种帧尺寸,从极低的分辨率到 4K 分辨率。较大的帧大小可提供更高的质量,但需要更多带宽来传输,并需要更强的处理能力来解码。

如果您要创建单一分辨率,640x480 是适用于各种网络和移动设备的稳妥选择。借助以下 FFmpeg 命令行参数,您可以创建比特率为 750kbps 的单分辨率文件。

-vf scale=640x480 -b:v 750k -quality good -speed 0 -crf 33 \
  -c:v libvpx-vp9 -c:a libopus output.webm

多分辨率编码

如果您打算以多种分辨率为目标,或者您的交付网络具有不同的带宽,建议您创建多种分辨率。然后,播放器可以控制发送给观看者的分辨率。

多分辨率视频编码通常用于自适应比特率流式传输,其中视频播放器会根据用户的带宽实时切换分辨率。例如,Shaka Player 可让您播放多分辨率编码,其中每个 VP9 编码都位于单独的文件中,并且 DASH 清单提供有关每个编码的信息。

如需详细了解如何以自适应流式传输格式打包视频,请参阅 Shaka Packager。本指南将重点介绍 VP9 在多种分辨率下的编码设置。

以下所有设置均可用于各种分辨率的单个文件,它们组合在一起可提供一套适用于自适应流式传输的全面设置。请注意,640x480 版本有两个版本,一个是低质量 (LQ) 版本,另一个是中等质量 (MQ) 版本。

比特率

建议在对 VP9 文件进行编码以供按需观看时使用受限质量 (CQ) 模式。这种编码模式允许您指定目标平均比特率,同时控制视频的最大质量以及最小和最大比特率。

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

对于上述示例,建议将最低比特率设置为目标比特率的 50%,将最高比特率设置为目标比特率的 145%。

帧大小/帧速率 目标比特率(视频点播,kbps) 最低比特率 (50%) 最高比特率 (145%)
320x240p @ 24、25、30 150 75 218
640x360p @ 24、25、30 276 138 400
640x480p @ 24、25、30 512(LQ)、750(MQ) 256(低质量)375(中等质量) 742(低品质)1088(中品质)
1280x720p @ 24、25、30 1024 512 1485
1280x720p @ 50、60 1800 900 2610
1920x1080p @ 24、25、30 1800 900 2610
1920x1080p @ 50、60 3000 1500 4350
2560x1440p @ 24、25、30 6000 3000 8700
2560x1440p @ 50,60 9000 4500 13050
3840x2160p @ 24、25、30 12000 6000 17400
3840x2160p @ 50、60 18000 9000 26100

图 2a:建议的 VOD 比特率

在 FFmpeg 中,比特率由以下命令控制:

FFmpeg
-b:v <arg> 设置比特率(例如 500k)
-minrate <arg>
-maxrate <arg>
设置最小和最大比特率。

例如,在对 640x480 内容进行编码时,您可以使用命令行 -b:v 750k -minrate 375 -maxrate 1088

质量

在 CQ 模式下,您还需要设置最高质量级别。建议为基于文件的 VP9 编码设置以下质量级别:

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

在 FFmpeg 中,可以使用 -crf 命令设置质量。例如,如需将质量设置为 33,您可以使用命令 -crf 33

多遍编码和编码速度

文件级编码可让您灵活调整速度。您还可以对同一素材进行多次处理以提高质量,并为每次处理选择速度。

在 FFmpeg 中对 VP9 文件进行编码时,建议将 -quality 参数设置为 good,然后根据下表使用 -speed 参数设置第一遍和第二遍的速度。这样可以在编码时间和输出质量之间取得良好的平衡。

帧高度 速度(首次通过) 速度(第二次通过)
240 4 1
360 4 1
480 4 1
720 4 2
1080 4 2
1440 4 2
2160 4 2

例如,FFmpeg 中的首次编码字符串可能包含 -quality good -speed 4

关键帧间距

建议在关键帧之间最多允许 240 帧视频(对于 30fps 的内容,为 8 秒)。关键帧是自给自足的视频帧;它们不依赖于任何其他帧来渲染,但往往比其他帧类型大。对于网页和移动设备播放,关键帧之间留有充足的间隔,可让编码器选择最佳的关键帧放置位置,以最大限度地提高质量。

在 FFmpeg 中,关键帧间距由 -g 命令控制,用于指示帧数。对于 240 帧,此值为 -g 240

平铺和线程建议

平铺会将视频帧拆分为多个列,这会略微降低画质,但会提高编码性能。平铺的宽度必须至少为 256 像素,因此可使用的平铺数量有限。

根据图块数量和输出帧的分辨率,使用更多 CPU 线程可能会很有用。一般来说,当输出帧大小非常小时,多线程的价值有限。

建议在各种分辨率下使用以下平铺和线程设置。

帧大小 平铺列数 线程数
320x240 1 (-tile-columns 0) 1
640x360 2 (-tile-columns 1) 2
640x480 2 (-tile-columns 1) 2
1280x720 4 (-tile-columns 2) 4
1920x1080 4 (-tile-columns 2) 4
2560x1440 8 (-tile-columns 3) 8
3840x2160 8 (-tile-columns 3) 8

在 FFmpeg 中,图块数量由 -tile-columns 参数控制,线程数量由 -threads 控制。例如,640x480 编码会使用命令行 -tile-columns 1 -threads 2

FFmpeg 命令行

综合考虑上述建议,可以使用以下 FFmpeg 命令对 VP9 内容进行编码。

请注意,第一遍和第二遍命令是链接在一起的。在第二遍命令中,当 FFmpeg 要求使用输出视频覆盖第一遍统计信息文件时,-y 实参会回答“是”。

另请注意,对于目标输出分辨率不超过 1280x720 的编码,系统会使用 1080p 的源。4K 片源用于生成较大输出。

320x240(每秒 24、25 或 30 帧)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-320x240.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-320x240.webm

640x360(每秒 24、25 或 30 帧)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x360.webm

640x480(低画质,每秒 24、25 或 30 帧)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-low.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-low.webm

640x480(中等画质,每秒 24、25 或 30 帧)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-medium.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-medium.webm

1280x720(每秒 24、25 或 30 帧)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-24-30fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1280x720-24-30fps.webm

1280x720(每秒 50 或 60 帧)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-50-60fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2-y tos-1280x720-50-60fps.webm

1920x1080(每秒 24、25 或 30 帧)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-24-30fps.webm

1920x1080(50 或 60 帧/秒)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-50-60fps.webm

2560x1440(每秒 24、25 或 30 帧)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-24-30fps.webm

2560x1440(每秒 50 或 60 帧)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-50-60fps.webm

3840x2160(每秒 24、25 或 30 帧)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-3840x2160-24-30fps.webm

3840x2160(每秒 50 或 60 帧)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -speed 2 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm