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


Answers:


215

-qscale:v

使用-qscale:v(或别名-q:v)作为输出选项。JPEG的有效范围是2-31,其中31是最差的质量。我建议尝试使用2-5的值。

要输出一系列图像:

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

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

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

这适用于任何视频输入。如果您输入的是MJPEG,请参见下文。


MJPEG

如果您输入的是MJPEG(动态JPEG),则可以提取图像而不会造成质量损失。

ffmpegffprobe控制台输出可以告诉你,如果你输入MJPEG:

$ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1 input.avi
codec_name=mjpeg

然后,您可以使用mjpeg2jpeg位流过滤器提取帧:

$ ffmpeg -i input.avi -codec:v copy -bsf:v mjpeg2jpeg output_%03d.jpg

另见


这似乎对我没有影响-qscale 1和2都提供相同的文件大小,并且(用我的肉眼)看起来与没有qscale时完全相同。
felwithe

您可以发布正在使用的完整命令行吗?另外,请在命令行上发布来自ffmpeg的完整,未剪切的输出。请注意,选项的放置是相关的,因此-qscale:v 2必须放置在-i inputfile选项之后,但在输出文件选项之前,才能生效。
Ronald S. Bultje 2015年

1
对我来说,添加-qmin 1 -qmax 1除了-q:v 1使文件大小增加了一倍。而且我似乎也看到了很小的改进。
0:43

1
@complistic:-qmin 1 -qmax 1产生了较大的文件,但给了我完全相同的图像。我通过photoshop,2层和差异过滤器对此进行了验证。像素相同。
cherouvim 2015年

@Kostanos您可以尝试-qmin 1 -q:v 1
llogan

0

以无损格式输出图像,例如PNG:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_%03d.png

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

与使用-qmin 1 -q:v 1并直接从JPEG输出为JPEG 相比,以这种方式可以获得JPEG格式的图像更加清晰ffmpeg


ffmpeg输出PNG8仅使用256色(与GIF相同)的文件。因此实际上是非常有损的。
lapin

@lapin我使用这种方法提取的PNG为24位(即使对于颜色少于256种的帧,尽管其他颜色有更多种)。该版本在Windows上使用4.2.1 x64版本。这里也写着:“如果我通过[ ffmpeg]命令从mp4中提取png ,我将获得与原始视频质量相同的高质量png。” ffmpeg您正在使用哪个版本的PNG8文件输出文件,输入格式是什么?
杰克

其实我认为您是对的,问题是当identify image.png结果不是真正的单通道8位,而是R,G和B的8位时,给出的结果为“ 8位”。IDK应该让普通identify用户理解那。
lapin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.