使用ffmpeg提取帧时,JPEG的颜色比PNG差吗?

3
当在特定时间标记处从视频中提取静态帧时,如下所示: ffmpeg -i foobar.mp4 -vframes 1 -ss 4:20 -q:v 1 example.png 我注意到使用PNG或JPG会产生不同的颜色。(请注意,-q:v 1表示最大图像质量)
以下是一些例子:
  1. JPGPNG
  2. JPGPNG
  3. JPGPNG
总的来说,JPG照片似乎比PNG照片略暗且饱和度较低。
使用exiftool或imagemagick的identify进行检查时,两个图像都使用sRGB颜色空间和无ICC配置文件。
你有什么想法是什么原因导致这种情况?或者这两个中哪一个是“正确”的?
我还尝试使用我的视频播放器(MPlayerX)保存截图,分别以JPG和PNG格式保存。在这种情况下,两种格式的帧转储看起来完全相同,并且它们看起来大多像ffmpeg的JPG静态图像。
2个回答

3
这段内容涉及到视频范围或级别。视频使用亮度和色差(即亮度和颜色之间的差异)来存储颜色。由于模拟信号时代的历史原因,黑白色并非在8位编码中分别表示为0和255,而是分别表示为16和235。视频流通常应标记这种情况,因为也可以存储其中0和255分别表示B和W的视频。如果文件未正确标记或标记错误,则某些呈现或转换功能可能会产生错误结果。但我们可以强制FFmpeg以一种或另一种方式解释输入。
使用方法:
ffmpeg -i foobar.mp4 -vframes 1 -ss 4:20 -q:v 1 -src_range 0 -dst_range 1 example.png/jpg

这段话告诉FFmpeg假设为工作室或有限范围,并输出到全范围。由于颜色编码转换,颜色仍然不会完全相同,但主要变化应该会消失。

我有和楼主一模一样的问题,我尝试了你的命令并进行了变化,但是PNG比JPG更亮。 就像楼主所说的那样,当我从像VLC这样的视频播放器中截取快照(包括PNG和JPG),颜色更像ffmpeg的JPG输出。所以也许那个是“正确”的,我不知道。 我尝试通过改变src_range和dst_range来解决问题,但PNG输出总是更亮。你还有什么建议吗? - Someone
我也尝试了PNG支持的所有像素格式,但仍然是同样的结果。老实说,我认为这里涉及到了PNG编码器的一个bug,但不确定。正在尝试寻找更多关于颜色范围的选项来尝试。 - Someone
这是同一主题下的 另一个问题。我建议使用以下参数应用视频 scale 滤镜:-vf scale=out_color_matrix=bt601:out_range=pc(仅在输出格式为 JPEG 时使用)。 - Rotem

0

我不太了解ffmpeg。但是,一般来说,JPEG图像可以进行压缩,以稍微降低质量,换取大幅度的文件大小减小。大多数能够写入JPEG文件的程序都会有一个开关(或者其他选项),用于设置“质量”、“压缩”或类似的选项。我似乎在我打开的半打机器上都没有ffmpeg,否则我会告诉你我认为正确的选项是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接