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,必须提供配置文件或者 2 或 3 。 |
-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
- 输出文件:2pass_HDR_strobe_scientist_6Mbps-static.webm
- 编码时间:142m30s
- 磁盘上的文件大小:51.2MB
示例 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
- 输出文件:2pass_HDR_strobe_scientist_18Mbps-static.webm
- 编码时间:213 分 32 秒
- 磁盘上的文件大小:161MB
示例 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
- 输出文件:1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- 编码时间:113m9s
- 磁盘上的文件大小:160MB
使用查询表 (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
- 输出文件:SDR_strobe_scientist_18Mbps-static.webm
- 编码时间:124 分 23 秒
- 磁盘上的文件大小:165MB
将 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
- 输出文件:HLG_HDR_strobe_scientist_18Mbps-static.webm
- 编码时间:186m10s
- 磁盘上的文件大小:165MB
总结
输出文件的大小各不相同。输入为 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。