如何在给定时间使用ffmpeg提取视频的1个屏幕截图?


109

有许多教程和资料显示了如何使用ffmpeg从视频中提取多个屏幕截图。您设置-r,甚至可以开始一定数量。

但是我只想在例如01:23:45 in处获得1个屏幕截图。或者在86%in处获得1个屏幕截图。

使用ffmpegthumbnailer可以实现所有功能,但这是我不想依赖的另一个依赖。我希望能够使用ffmpeg做到这一点。

Answers:


208

使用-ss选项:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • 对于JPEG输出,用于-q:v控制输出质量。完整范围是1-31的线性比例,其中较低的值表示较高的质量。2-5是一个很好的尝试范围。

  • 所述选择滤波器提供了一种替代方法,对于更复杂的需求,例如仅选择某些帧类型,或1每100等

  • -ss在输入之前放置会更快。请参阅FFmpeg Wiki:寻求以及ffmpegcli工具文档中的以下摘录:

-ss 位置(输入/输出)

当用作输入选项(之前-i)时,在此输入文件中查找以定位。请注意,大多数格式都无法精确查找,因此ffmpeg将搜索到位置之前最接近的搜索点。-accurate_seek启用转码并启用(默认设置)后,搜寻点和位置之间的此额外片段将被解码并丢弃。在进行流复制或 -noaccurate_seek使用时,将保留它。

当用作输出选项时(在输出文件名之前),将解码但丢弃输入,直到时间戳到达位置为止。

位置可以是秒,也可以是hh:mm:ss[.xxx]形式。


2
这要快得多。非常感谢。将-ss放在首位会有很大的不同。
Peter Bengtsson

在指定的时间后,有什么方法可以获取第n帧?

@GuntherPiez我在任何地方都没有提到任何可能的工件。
Stefan Reich

2
请注意,vframes(至少)在4.2.2版中已作废。根据手册,“ [ vframes]是' -frames:v' 的过时别名,应改为使用。
Synexis

完美且快速地工作。
Smeterlink

37

FFMpeg可以通过寻找给定的时间戳并精确地提取一帧作为图像来做到这一点,例如:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

让我们解释一下这些选项:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

-ss参数HH:MM:SS[.xxx]以秒的形式或形式接受一个值。如果需要百分比,则需要事先计算视频时长。


似乎按预期工作。我目前正在测试是否与使用ffmpegthumbnailer相同的速度。
彼得·本格森


7
尝试在-i之前使用-ss选项,因为它将跳过管道的解码部分。这可能会加快该过程。
SirDarius 2014年

1
有什么方法可以将PNG输出为流而不是文件?
Nicke Manarin

1
@NickeManarin是的 ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg。请注意,正如其他人所建议的那样,我还在命令行上的输入文件之前放置了-ss“搜索”选项。
Glenn Slayden
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.