如何使用 ffmpeg 从视频文件中提取高质量的 JPEG 图像?

Posted

技术标签:

【中文标题】如何使用 ffmpeg 从视频文件中提取高质量的 JPEG 图像?【英文标题】:How can I extract a good quality JPEG image from a video file with ffmpeg? 【发布时间】:2012-04-30 19:26:03 【问题描述】:

目前我正在使用这个命令来提取图像:

ffmpeg -i input.mp4 output_%03d.jpeg

但是如何提高 JPEG 图像质量?

【问题讨论】:

目前的质量有什么问题,除了不“好”? 【参考方案1】:

使用-qscale:v控制质量

使用-qscale:v(或别名-q:v)作为输出选项。

JPEG 的正常范围是 2-31,其中 31 是最差的质量。 比例是线性的,qscale 的两倍大约是比特率的一半。 建议尝试 2-5 的值。 您可以使用值 1,但必须添加 -qmin 1 输出选项(因为默认值为 -qmin 2)。

输出一系列图像:

ffmpeg -i input.mp4 -qscale:v 2 output_%03d.jpg

有关图像输出的更多选项,请参阅image muxer documentation。

以约 60 秒的持续时间输出单个图像:

ffmpeg -ss 60 -i input.mp4 -qscale:v 4 -frames:v 1 output.jpg

不断覆盖/更新/保存到单个图像

使用-update 1 image muxer 选项。来自实时流输入的每秒一次示例:

ffmpeg -i rtmp://input.foo -q:v 4 -r 1 -update 1 output.jpg

另见

FFmpeg FAQ: How do I encode movie to single pictures? FFmpeg Wiki: Create a thumbnail image every X seconds of the video

【讨论】:

这似乎对我没有影响——qscale 1 和 2 都给出相同的文件大小,并且(在我的肉眼看来)看起来与没有 qscale 完全一样。 你能发布你正在使用的完整命令行吗?还请在命令行上发布 ffmpeg 的完整、未删减的输出。请注意,选项的放置是相关的,因此 -qscale:v 2 需要放置在 -i inputfile 选项之后,但在输出文件选项之前,以产生任何效果。 对我来说,在 -q:v 1 之外添加 -qmin 1 -qmax 1 会使文件大小翻倍。而且我似乎也看到了非常轻微的改善。 @complistic: -qmin 1 -qmax 1 导致文件更大,但给了我完全相同的图像。我通过 Photoshop、2 层和差异过滤器验证了这一点。像素是一样的。 @Kostanos 你可以试试-qmin 1 -q:v 1【参考方案2】:

以PNG等无损格式输出图片:

mkdir stills
ffmpeg -i my-film.mp4 -vsync 0 -f image2 stills/my-film-%06d.png

然后使用另一个程序(您可以在其中更精确地指定质量、二次采样和 DCT 方法 - 例如 GIMP)将您想要的 PNG 转换为 JPEG。

-qmin 1 -q:v 1 和直接从ffmpeg 输出为JPEG 相比,这种方式可以获得稍微清晰的JPEG 格式图像。

如果您只想提取关键帧(可能具有更高质量的后期编辑),您可以使用以下内容:

ffmpeg -skip_frame nokey -i my-film.mp4 -vsync 0 -f image2 stills/my-film-%06d.png

-vsync 0 参数避免了需要用-r 指定帧速率,并且意味着输入文件中的所有帧都被视为,嗯,一帧。

【讨论】:

ffmpeg 输出仅使用 256 色(与 GIF 相同)的 PNG8 文件。所以它实际上是非常有损的。 @lapin 我使用这种方法提取的 PNG 是 24 位的(即使对于少于 256 种颜色的帧,尽管其他的有更多)。这是在 Windows 上使用版本 4.2.1 x64。还写了here 是:“如果我从mp4 中提取png,使用这个[ffmpeg] 命令,我可以获得与原始视频质量相同的高质量png。”您正在使用哪个版本的ffmpeg 输出PNG8 文件,您的输入格式是什么? @DonnyV。您不能对评论投反对票(仅“标记为不合适”)。很高兴这有帮助。谢谢你提醒我我发布了这个。我重新检查了我给出的示例命令并更新了我的答案,以提供一些更好的替代方案,这些替代方案更类似于我现在使用的,我对ffmpeg 有了更多的了解。 我发现您的解决方案可以生成高质量的关键帧,但我认为它必须以更清晰的方式排列。 @pouya 在播放过程中暂停视频,你能得到更好的结果吗?如果没有,那么您没有足够质量的原始视频副本来完成您尝试做的事情。如果您设置了-q2,我已经看到ffmpeg 将JPEG 压缩质量设置为90(而不是70)的源代码,但这仍然低于我通常使用的。另请注意,它是从已经压缩的电影中重新压缩静止图像,并且“关键帧”的质量会更好。但是,虽然 MPEG 是基于 JPEG 的,但似乎无法将关键帧直接提升为 JPEG 图像。

以上是关于如何使用 ffmpeg 从视频文件中提取高质量的 JPEG 图像?的主要内容,如果未能解决你的问题,请参考以下文章

使用ffmpeg从视频文件中提取音频文件视频抽帧和切割视频

FFmpeg从视频中提取音频

当我使用 ffmpeg 从视频中提取音频时,出现错误

如何使用 ffmpeg 从 MPEG-4 文件中提取音频 [关闭]

在 django 中使用 FFMPEG 在网络上上传后从视频中提取 WAV 音频文件

使用 ffmpeg 和 python 将视频中的所有音频流提取到单独的音频文件中