VP9 HDR 编码
高动态范围 (HDR) 视频是一项日趋成熟的技术。如今,许多标准正在逐步统一。
如需了解 HDR 视频演变的最新情况,请参阅维基百科文章高动态范围视频。
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 解码的设备(魅族 Pro 7)
- 2017 年的超高清蓝光
用于启用 VP9 Profile 2 和 HDR EOTF 的 FFmpeg 命令行设置
您的 FFmpeg 需要已构建为支持 10 位(甚至 12 位)。
在下面的示例中,我们使用静态构建的 ffmpeg
,并支持 10 位。
您可以使用我们的构建脚本自行创建,也可以按照 FFmpeg 网站上的指南进行操作。
以下是一个可用的 FFmpeg 命令行,用于将 HDR 编码为 SMPTE 2084 (PQ EOTF) 标准(使用 VP9):
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
以下是此处介绍的关键参数:
ffmpeg | 支持 10 位的静态 build |
---|---|
-pass 1 |
HDR 需要进行双遍编码。在此示例中,第一次传递的输出结果会写入 /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_coefficients”。此值应与内容母带的制作方式保持一致。(例如,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%。这些示例通常以 18 Mbps 为目标。通过最佳调整,12 Mbps 的比特率即可实现良好的 HDR 效果。
编码是在具有以下规格的 Ubuntu Linux 系统上执行的:
- 处理器:4 个 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:6 Mbps 4K 双遍
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
- 编码时间:142 分 30 秒
- 光盘上的文件大小:51.2MB
示例 B1:18 Mbps 4k 双遍
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:18 Mbps 1080p 双遍
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
- 编码时间:113 分 9 秒
- 光盘上的文件大小:160MB
使用查询表 (LUT) 将 HDR 转换为 SDR
将 HDR 转换为 SDR 需要转码器了解如何将亮度级别和颜色映射到较小的 BT.709 色彩空间和非 HDR 亮度范围。为获得最佳效果,可以使用描述如何执行该映射的 LUT(通常特定于内容)。示例 C 和 D 展示了如何使用 LUT。我们使用了 bt2020_to_bt709_example.cube
示例 C:18 Mbps 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 双遍 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
- 编码时间:186 分 10 秒
- 光盘上的文件大小:165MB
摘要
输出文件的大小各不相同。输入为 4.3GB。
示例 | 目标输出 | 磁盘大小 | 编码时间 |
---|---|---|---|
A | 6 Mbps 4K 未缩放 HDR | 51.2MB | 142 米 |
B1 | 18Mbps 4k 未缩放 HDR | 161MB | 213m |
B2 | 18Mbps 1080 缩放 HDR | 160 MB | 1.13 亿 |
C | 18Mbps HDR 到 SDR 未缩放 | 165MB | 1.24 亿 |
D | 18Mbps HLG 转换 | 165MB | 168m |
请注意,建议对 HDR 使用双遍编码,因为单遍编码在某些配置中可能会有所不同。
在 WebM 和 MP4 输出中发出 HDR 信号所需的工具(Matroska 命令行工具)
在撰写本文时,FFmpeg 不提供在 WebM/MKV 中指定 SMPTE 2086 静态元数据的机制,但如果输入流包含该元数据,FFmpeg 会将其从输入流中传播出去。
如果您的应用需要,可以使用 mkvtoolnix 的一部分 mkvmerge 工具插入或修改此元数据。
以下示例展示了如何将 HDR 元数据插入到上述创建的文件之一中。它尤其适合准备 HDR 内容以供上传到 YouTube。
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 文件。