使用 FFmpeg 将 GIF 转换为 VP9 WebM 时颜色会发生变化

使用 FFmpeg 将 GIF 转换为 VP9 WebM 时颜色会发生变化

VP8 WebM当我尝试使用或 时,颜色效果很好H264 MP4,但每当我使用 时,VP9 WebM颜色都会有轻微的变化。颜色的变化可以在 中看到Chrome,不确定其他浏览器或查看器是否如此。我也尝试过ezGIF 在线 GIF 到 WebM 转换器(在引擎盖下使用FFmpeg),并且它运行良好(颜色保持不变),所以我不确定为什么当我FFmpeg在本地运行时它不能正常工作。

我使用的命令:

ffmpeg -i duck.gif duck.webm

色差截图:

鸭子颜色差异

原文GIF原创 鸭子 GIF

输出WebMhttps://sportyz.000webhostapp.com/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.601BT.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>

Chrome浏览器中的输出:
在此处输入图片描述

相关内容