使用 avconv/ffmpeg 将 RGB 图像转换为无损视频

使用 avconv/ffmpeg 将 RGB 图像转换为无损视频

我正在尝试将一系列包含屏幕动画的 PNG24 图像转换为无损视频,以便每个像素都与原始图像完全相同。但是 avconv(和 ffmpeg)都产生了相同的、不令人满意的结果,这似乎是由于 colospace 转换出错造成的。

这是我正在使用的 avconv 版本:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:02:36 with gcc 4.6.3

每幅图像的尺寸为 1280×800 像素。它们不包含任何摄影主题,而是经过特殊抖动的图案。

我使用qtrle编解码器是因为显然这是一个无损编解码器,其工作方式与动画 GIF 或动画 PNG 非常相似。然而,在转换为视频的过程中似乎发生了颜色空间转换(“过滤器”),这会弄乱像素。

这是 avconv 输出:

$ avconv -f image2 -r 30 -i frames.png/wth-%08d.png -vcodec qtrle -pix_fmt rgb24 -t 15 qtrle-30fps-rgb.mov
avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:02:36 with gcc 4.6.3
Input #0, image2, from 'frames.png/wth-%08d.png':
  Duration: 00:11:17.96, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: png, bgra, 1280x800, 30 fps, 30 tbr, 30 tbn, 30 tbc
File 'qtrle-30fps-rgb.mov' already exists. Overwrite ? [y/N] y
[buffer @ 0x740a00] w:1280 h:800 pixfmt:bgra
[avsink @ 0x742ac0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x743680] w:1280 h:800 fmt:bgra -> w:1280 h:800 fmt:rgb24 flags:0x4
Output #0, mov, to 'qtrle-30fps-rgb.mov':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: qtrle, rgb24, 1280x800, q=2-31, 200 kb/s, 30 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> qtrle)
Press ctrl-c to stop encoding
frame=  450 fps= 22 q=0.0 Lsize=  126056kB time=15.00 bitrate=68843.4kbits/s    
video:126052kB audio:0kB global headers:0kB muxing overhead 0.003441%

这是一个原始的 PNG 图像文件:

在此处输入图片描述

这是正在重播的视频的截图:

回放视频截图

请注意,您需要以原始的 1280×800 分辨率查看这些图像才能注意到差异。

以下是并排比较,左图为原图,右图为视频编码后的结果:

在此处输入图片描述

有没有什么方法可以通过一系列 PNG 制作出真正无损、像素完美的视频文件?

答案1

在 ffmpeg 贡献者的帮助下,我们发现 ffmpeg 和 libav 都可以创建完美无损的 Quicktime 文件。问题似乎是显卡驱动程序错误地显示视频(因为基于 GStream 的播放器和 VLC 都显示错误,但 VLC 导出的视频帧完美无缺)。如果您想检查视频是否真的逐像素包含帧,请尝试使用

$ ffmpeg -i input.png -vcodec qtrle out.mov

$ ffmpeg -i input.png -f framecrc -
$ ffmpeg -i out.mov -f framecrc -

这将输出帧数据校验和。

为了进行视觉比较,将无损视频转换回单帧并进行比较。

答案2

我发表了一个较长的回答: 如何使用 FFMPEG 从一系列 1000 个 PNG 图像创建未压缩的 AVI

vcodeclibx264rgb-preset ultrafast -qp 0、 或utvideo

相关内容