有许多教程和材料展示了如何使用 ffmpeg 从视频中提取多个屏幕截图。你可以设置 -r,甚至可以在。
但是我只需要一个截图,比如01:23:45 in,或者一个截图86% in。
这对于 Fmpegthumbnailer来说都是可能的,但是它是我不想依赖的另一个依赖项。我希望能够做到这一点与 ffmpeg。
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
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是个不错的范围。
-q:v
选择过滤器为更复杂的需求提供了一种替代方法,比如只选择特定的帧类型,或者每100帧选择1帧,等等。
把 -ss放在输入之前会更快。参见 寻找和这段摘录自 ffmpeg cli 工具文档:
ffmpeg
-ss位置(输入/输出) 当作为输入选项使用时(在 -i之前) ,在此输入文件中寻找定位。注意,在大多数格式中都不可能查找 正是如此,所以 ffmpeg将寻找最近的寻找点之前 当转码和 -accurate_seek被启用时( (默认值) ,这个在寻道点和位置之间的额外段将 被解码和丢弃。当做流复制或当 如果使用 -noaccurate_seek,它将被保留。 当用作输出选项时(在输出文件名之前) ,解码但丢弃输入,直到时间戳到达位置。 位置可以是秒或 hh:mm:ss[.xxx]形式。
-ss位置(输入/输出)
当作为输入选项使用时(在 -i之前) ,在此输入文件中寻找定位。注意,在大多数格式中都不可能查找 正是如此,所以 ffmpeg将寻找最近的寻找点之前 当转码和 -accurate_seek被启用时( (默认值) ,这个在寻道点和位置之间的额外段将 被解码和丢弃。当做流复制或当 如果使用 -noaccurate_seek,它将被保留。
-i
-accurate_seek
-noaccurate_seek
当用作输出选项时(在输出文件名之前) ,解码但丢弃输入,直到时间戳到达位置。
位置可以是秒或 hh:mm:ss[.xxx]形式。
hh:mm:ss[.xxx]