image - 使用ffmpeg提取帧时,jpeg颜色比png更差?

标签 image colors ffmpeg format screenshot

在特定时间标记从视频中提取静止帧时,如下所示:
ffmpeg -i foobar.mp4 -vframes 1 -ss 4:20 -q:v 1 example.png
我注意到使用 PNG 或 JPG 会产生不同的颜色。(注意 -q:v 1 表示最高图像质量)

这里有些例子:

  • JPGPNG
  • JPGPNG
  • JPGPNG

  • 一般来说,JPG 的照片似乎比 PNG 的照片更暗,饱和度更低。

    exiftool 核对时或 imagemagick 的 identify ,两个图像都使用 sRGB 色彩空间并且没有 ICC 配置文件。

    知道是什么原因造成的吗?或者这两个中的哪一个是“正确的”?

    我还尝试使用我的视频播放器 (MPlayerX) 以 JPG 和 PNG 格式保存屏幕截图。在这种情况下,两种格式的帧转储看起来完全一样,它们看起来很像 ffmpeg 的 JPG 静止图像。

    最佳答案

    这与视频范围或级别有关。视频将颜色存储为亮度和色度,即亮度和色差,并且由于模拟信号时代的遗留原因,黑色和白色在 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 假设工作室或有限范围并输出到全范围。由于颜色编码转换,颜色仍然不会相同,但主要变化应该消失。

    关于image - 使用ffmpeg提取帧时,jpeg颜色比png更差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38199238/

    相关文章:

    ffmpeg - 如何在不丢失时间信息的情况下将 H264/RTP 流转储到文件中?

    image - ffmpeg 降低图像质量,而不是大小

    javascript - 图像动画/如何在页面加载时让图像滑入? (HTML/JavaScript)

    java - java getData().getPixels() 是否有类似的 android 方法?

    c# - 输入字符串的方法输出颜色对象C#

    android - 如何有条件地改变Android中的文本颜色?

    html - 边框颜色忽略我的颜色

    ios - 无法将 Base64 字符串解码为图像?

    android - 在 android studio 中包含共享库 .so

    ffmpeg - tee 多路复用器失败并出现错误 : Output file #0 does not contain any stream