VP9 HDR 编码

高动态范围 (HDR) 视频是一种成熟的技术。如今,有许多标准的逐渐形成标准。

如需查看 HDR 视频演变的全貌,请参阅 WikiPedia 文章高动态范围视频

FFmpeg 可以与 VP9 搭配使用,以 (1) 将 HDR 源压缩为标准动态范围 (SDR) 输出,或 (2) 用于将 HDR 源重新打包为适用于 HDR 的网页格式。

输入来源

目前,使用 VP9 编码 HDR 时,FFmpeg 支持的任何高位深度(10 位)编解码器均可用作输入(例如,VP9 Profile 2 和 3、H.264(10 位)、DNxHR、HEVC、ProRes 等)。另请参阅 YouTube 支持文章上传高动态范围 (HDR) 视频

编码输出覆盖面:

目前和一般情况下,支持的目标设备包括可解码 VP9 Profile 2 并输出到 HDR 显示器的任何设备。

  • Chromecast Ultra + 支持 HDR 的电视
  • Windows 10 Fall Creators Update 上的 Chrome 64 Canary 版,已开启 HDR 标志。(这是一个很好的调试工具)。
  • 任何具备 VP9 Profile 2 的 HDR TV
    • 所有三星 2017 HDR 型号(flatpanelshd.com 列表)以及以“KS”开头的 2016 型号
    • 所有 LG 2017 HDR 型号(以及部分 2016 年 LG G6 型号)
    • 在移动设备上,支持硬件加速的 VP9 Profile 2 10 位 HDR 解码设备(Meizu Pro 7
    • 2017 年拍摄的超高清蓝光

用于启用 VP9 Profile 2 和 HDR EOTF 的 FFmpeg 命令行设置

您的 FFmpeg 必须是在 10 位(甚至 12 位)支持的基础上构建的。

在下面的示例中,我们使用支持 10 位静态构建的 ffmpeg。您可以使用我们的构建脚本来自行创建,或遵循 FFmpeg 网站上的指南

以下是一个实用的 FFmpeg 命令行,可按照具有 VP9 的 SMPTE 2084 (PQ EOTF) 标准进行 HDR 编码:

ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 /dev/null && \
   ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 2 \
   -pix_fmt yuv420p10le \
   -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
   -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 \
   strobe_scientist_18Mbps.webm

下文对关键参数进行了详细介绍:

MPMPG 支持 10 位架构的静态 build
-pass 1 HDR 需要 2 通道编码。在此示例中,第一次传递会输出到 /dev/null,并在第二次传递期间在内存中进行处理。
-pix_fmt yuv420p10le 设置 YUV 4:2:0 10 位像素格式
-color_primaries 9 设置 BT2020 请参阅本文档第 5 页和第 6 页了解详情。
-color_trc 16 16 将“传递特性”设置为 SMPTE 2084。PQ 18 设置传输特性 SMPTE 2086 HLG
-colorspace 9 colorspace 是“Matrix_coefficiencys.”此值应与内容母带设置保持一致。(例如 bt709、bt2020_ncl)。在此示例中,bt2020_ncl 应为 9。如需进一步参考,请参阅本文档的第 12 页
-color_range 1 颜色范围(0 = 未指定,1 = mpeg/studio/tv,2 = jpeg/full/pc)
-profile:v 2 如果是 HDR,必须提供配置文件或者 23
-vcodec libvpx-vp9 使用 VP9 编码器。

编码示例

以下示例全部使用源文件 strobe_scientist.mkv

一般而言,对于采用 HDR 编码的比特率,建议的比特率比等效的 8 位 SDR 编码高 25-30%。这些示例通常以 18Mbps 为目标。以 12Mbps 的比特率通过最佳调谐实现良好的 HDR 结果。

此类编码在 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

转换为 YUV 4:2:0 10 位 PQ

示例 A:6Mbps 4k 2 通道
ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_6Mbps-static.webm
示例 B1:18Mbps 4k 2 通道
ffmpeg -y -report -i strobe_scientist.mkv -b:v **18000000** -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_18Mbps-static.webm
示例 B2:18Mbps 1080p 2 通道
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  1080_2pass_HDR_strobe_scientist_18Mbps-static.webm

使用查询表 (LUT) 将 HDR 转换为 SDR

将 HDR 转换为 SDR 要求转码器了解如何将亮度和颜色映射到较小的 BT.709 颜色空间和非亮度 HDR 范围。为获得最佳结果,可以使用描述如何执行该映射的 LUT(通常特定于内容)。示例 C 和 D 展示了如何使用 LUT。我们使用了 bt2020_to_bt709_example.cube

示例 C:18Mbps 4K HDR 转 SDR(使用 LUT)
ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm SDR_strobe_scientist_18Mbps-static.webm

将 HLG 转换为 VP9 HLG10 10 位 PQ

需要 HLG 来源。我们使用了输入文件 strobe_scientist_hlg.mkv

示例 D:18Mbps 4k 2 通道 HLG
ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 1 -speed 4 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  HLG_HDR_strobe_scientist_18Mbps-static.webm

总结

输出文件的大小各不相同。输入为 4.3GB。

示例 目标输出 占用空间 对时间进行编码
A 6Mbps 4K 未缩放的 HDR 51.2MB 1.42 亿
B1 18Mbps 4K 未缩放 HDR 161MB 2.13 亿
B2 18Mbps 缩放 HDR 160 MB 1.13 亿
C 18Mbps HDR 至 SDR 的未缩放比例 165MB 124 米
D 18Mbps HLG 转换 165MB 1.68 亿

请注意,建议在 HDR 应用中使用 2 路编码,因为 1 路编码在某些配置中可能会有所不同。

在 WebM 和 MP4 输出中发出 HDR 信号所需的工具(Matroska 命令行工具)

在撰写本文时,FFmpeg 尚未提供在 WebM/MKV 中指定 SMPTE 2086 静态元数据的机制,尽管它会在输入流中包含该输入流时进行传播。

mkvmerge 工具是 mkvtoolnix 的一部分,可在您的应用需要时用于插入或修改此元数据。

以下是将 HDR 元数据插入上述其中一个文件的一个示例。该工具特别适合准备要上传到 YouTube 的 HDR 内容

mkvmerge \
  -o HDR_strobe_scientist_18Mbps.mkv\
  --colour-matrix 0:9 \
  --colour-range 0:1 \
  --colour-transfer-characteristics 0:16 \
  --colour-primaries 0:9 \
  --max-content-light 0:1000 \
  --max-frame-light 0:300 \
  --max-luminance 0:1000 \
  --min-luminance 0:0.01 \
  --chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 \
  --white-colour-coordinates 0:0.3127,0.3290 \
  HDR_strobe_scientist_18Mbps.webm

该示例会在 0.6 秒内生成文件 HDR_strobe_scientist_18Mbps.mkv