如何使用ffmpeg在给定时间从视频中提取1个截图?

192

有很多教程和资料展示了如何使用 ffmpeg 从视频中提取多个截图。你设置 -r 即可开始并连续获取。

但我只需要在某个特定时间点如01:23:45 或者在86%时获取1张截图。

使用 ffmpegthumbnailer 可以实现这一切,但这是另一个我不想依赖的库。我想要能够用 ffmpeg 实现。

2个回答

342
使用-ss选项:
ffmpeg -ss 01:23:45 -i input -frames:v 1 -q:v 2 output.jpg
  • 对于JPEG输出,使用-q:v来控制输出质量。完整范围是1-31的线性刻度,较低的值会产生更高的质量。2-5是一个不错的范围。

  • 选择过滤器提供了一种替代方法,用于更复杂的需求,例如仅选择某些帧类型或每100个等。

  • 在输入之前放置-ss将更快。请参见FFmpeg Wiki: Seekingffmpeg cli tool documentation中的摘录:

-ss 位置(输入/输出)

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

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

位置可以是秒或hh:mm:ss[.xxx]格式。


8
这样会快很多,非常感谢。将-ss放在前面会有很大的改善。 - Peter Bengtsson
@GuntherPiez 我没有看到任何关于可能出现的伪影的提及。 - Stefan Reich
7
请注意,在(至少)4.2.2版本中,vframes已经过时。根据手册,“[vframes]是'-frames:v'的过时别名,您应该使用它代替。” - Synexis
我的视频长度为15秒,即15,000毫秒。但是当我尝试获取15,000时,会出现错误,但如果我尝试获取14,800就没问题了。最新帧可能有什么问题? - Kyryl Zotov
1
请注意,如果出现警告“指定的文件名'output.jpg'不包含图像序列模式或模式无效。\n请使用诸如%03d之类的模式进行图像序列,或者在需要时使用-update opt(带有-frames:v 1)来编写单个图像。”,您可以在“-frames:v 1”和“output.jpg”之间放置“-update 1”。 - http8086
显示剩余3条评论

67

FFmpeg可以通过定位到给定的时间戳并将一个帧作为图像提取出来来实现此功能,例如:

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

让我们解释一下选项:

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

-ss参数接受形如HH:MM:SS[.xxx]或以秒为单位的数字。如果你需要一个百分比,你需要事先计算视频的持续时间。


似乎按照预期运行。我目前正在进行基准测试,看看这是否与使用ffmpegthumbnailer相同的速度。 - Peter Bengtsson
是的,这种方法非常慢。请参见http://www.peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos - Peter Bengtsson
16
在使用-i选项之前尝试使用-ss选项,因为它将跳过管道的解码部分。这可能会加快处理速度。 - SirDarius
2
有没有办法将输出作为PNG流而不是文件? - Nicke Manarin
7
是的,注意我在命令行中把 -ss "seek" 选项放在输入文件之前,这是其他人推荐的方法。命令为 ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg,它将视频文件 video.mp4 在时间点 01:23:45 处停止,并将该帧作为 PNG 图像保存到文件 image.jpg 中。 - Glenn Slayden
显示剩余2条评论

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