VP8 WebM
当我尝试使用或 时,颜色效果很好H264 MP4
,但每当我使用 时,VP9 WebM
颜色都会有轻微的变化。颜色的变化可以在 中看到Chrome
,不确定其他浏览器或查看器是否如此。我也尝试过ezGIF 在线 GIF 到 WebM 转换器(在引擎盖下使用FFmpeg
),并且它运行良好(颜色保持不变),所以我不确定为什么当我FFmpeg
在本地运行时它不能正常工作。
我使用的命令:
ffmpeg -i duck.gif duck.webm
色差截图:
答案1
添加-vf scale=out_color_matrix=bt709:out_range=tv
到 FFmpeg 命令似乎可以解决问题。
“以防万一”,我们还可以将流元数据标记为 BT.709 和“TV Range”:
ffmpeg -y -i duck.gif -vf scale=out_color_matrix=bt709:out_range=tv -pix_fmt yuva420p -bsf:v vp9_metadata=color_space=bt709:color_range=tv duck2.webm
对于非 HDR 视频,主要使用两种色彩标准:BT.601和BT.709.
不同之处在于RGB到YUV颜色空间的转换矩阵。
YUV 也有两个主要颜色范围:“TV 范围”应用范围 [16, 235] 内的值,“PC 范围”应用范围 [0, 255] 内的值。
看起来 FFmpeg 默认使用 BT.601 转换(编码 VP9 时),而 Chrome 则采用 BT.709 标准(解码 VP9 时)。
结果出现了明显的“色彩偏移”。
为了解决这个问题,我们可以选择“BT.709”和“TV Range”明确地。
scale=out_color_matrix=bt709:out_range=tv
- 使用 BT.709 转换公式和“TV 范围”范围强制从 RGB 到 YUV 的转换。-bsf:v vp9_metadata=color_space=bt709:color_range=tv
将流元数据设置为 BT.709 和“电视范围”(可能不需要)。
用于测试的 HTML 代码:
<body style="background-color:cornflowerblue">
<img src="duck.gif">
<div>Original GIF</div>
<br><br><br>
<video autoplay loop muted playsinline src="duck2.webm"></video> <div>WebM conversion with bt709 and TV range</div>
<br><br><br>
</body>