如何使用 ffmpeg 将一系列 PNG 文件转换为视频容器时尽可能地保留 RGB 颜色?

如何使用 ffmpeg 将一系列 PNG 文件转换为视频容器时尽可能地保留 RGB 颜色?

我有 950 个 PNG 文件,它们将变成 38 秒视频轨道中的单个帧,每秒 25 帧。文件名除了序列号外都相同,这在此类情况下很常见。

我想从我拥有的这一系列 PNG 图像中生成一个广泛支持的格式的容器,理想情况下是 WebM(如果所有条件都可以满足的话),或者例如 MPEG-4,使用现代浏览器支持的编解码器进行播放。问题是颜色发生了变化,解码后的视频中的背景颜色不再与从 PNG 图像中的背景颜色采样的相同 RGB 三元组匹配。这导致视频从嵌入视频的 HTML 页面上的预期背景中突出。

我尝试了简单的方法:

ffmpeg -f image2 -i image%03d.png output.webm

它确实给了我一个打包在 WebM 容器中的 25 fps VP9 视频轨道。

PNG 图像是动画风格,背景为纯色,前景为简单形状动画。它们看起来是彩色的未标记(这是 Adob​​e Bridge 告诉我的,我猜这意味着没有嵌入颜色配置文件或对颜色配置文件的引用)。我上述尝试的问题是,即使在 Chrome 中播放容器,从 PNG 图像中采样的背景颜色(具有 RGB 三元组#ED4D56)在感知上与正在播放的视频中出现的背景颜色不匹配。

这是 RGB 到 YUV(编码)再到 RGB(播放)颜色转换不可避免的副作用吗?有什么方法可以缓解这种情况吗?我并不坚持使用 RGB 对视频轨道中的帧进行编码,我认为 YUV 是可以的,只要播放这些帧的现代浏览器在解码和显示帧时产生相同的(在可忽略的误差范围内)RGB 三元组即可。

我的问题是,ffmpeg我可以尝试使用什么命令行来缓解这种情况?我愿意切换视频编解码器、像素格式,在 ffmpeg 中启用颜色管理(如果存在)等。

答案1

我最近有一个非常类似的任务,我想说仍然没有完美的解决方案(截至 2018 年 10 月)。这确实是低精度 RGB 到 YUV 再到 RGB 颜色转换的副作用。即使是一些“无损”编解码器变体(例如libvpx-vp9 -lossless)也会因 YUV 颜色空间而产生扭曲的颜色。

  • 如果可以接受不精确的颜色,那么libvpx编解码器可以做出相当出色的工作:

    ffmpeg -r 25 -i image%03d.png -c:v libvpx -crf 4 -b:v 0 output.webm
    

    使用这些设置,它会产生可忽略不计的色彩偏移,甚至可以产生某些帧集的精确色彩。VPx 编解码器受到广泛支持(IE 和 Safari 以外的所有主流浏览器),并且可产生合理的文件大小。

  • 如果严格要求精确的颜色,那么我们需要避免颜色空间转换。我想到的唯一跨浏览器解决方案是使用动画 pngimages.ffmpeg对 apng 仅提供非常基本的支持,因此最好使用其他工具,例如apngasm

    apngasm output.png image001.png 1 25
    

    它可以在除 IE 和 Edge 之外的任何地方工作(在这些浏览器上它会回退到静态第一帧)。文件大小非常大,但这就是真正的无损编码的代价。

  • libx264rgb编解码器也应该提到 - 使用它将要 当浏览器支持时,这是对精确的 RGB 颜色进行编码的正确方法。

相关内容