我有 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 图像是动画风格,背景为纯色,前景为简单形状动画。它们看起来是彩色的未标记(这是 Adobe 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 颜色进行编码的正确方法。