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

有许多教程和材料展示了如何使用 ffmpeg 从视频中提取多个屏幕截图。你可以设置 -r,甚至可以在。

但是我只需要一个截图,比如01:23:45 in,或者一个截图86% in。

这对于 Fmpegthumbnailer来说都是可能的,但是它是我不想依赖的另一个依赖项。我希望能够做到这一点与 ffmpeg。

159231 次浏览

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]的值或以秒为单位的数字。如果需要一个百分比,则需要事先计算视频持续时间。

使用 -ss选项:

ffmpeg -ss 01:23:45 -i input -frames:v 1 -q:v 2 output.jpg
  • 对于 JPEG 输出使用 -q:v控制输出质量。全范围是1-31的线性范围,较低的值导致较高的质量。2-5是个不错的范围。

  • 选择过滤器为更复杂的需求提供了一种替代方法,比如只选择特定的帧类型,或者每100帧选择1帧,等等。

  • -ss放在输入之前会更快。参见 寻找和这段摘录自 ffmpeg cli 工具文档:

-ss位置(输入/输出)

当作为输入选项使用时(在 -i之前) ,在此输入文件中寻找定位。注意,在大多数格式中都不可能查找 正是如此,所以 ffmpeg将寻找最近的寻找点之前 当转码和 -accurate_seek被启用时( (默认值) ,这个在寻道点和位置之间的额外段将 被解码和丢弃。当做流复制或当 如果使用 -noaccurate_seek,它将被保留。

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

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