有很多教程和资料展示了如何使用 ffmpeg 从视频中提取多个截图。你设置 -r 即可开始并连续获取。
但我只需要在某个特定时间点如01:23:45 或者在86%时获取1张截图。
使用 ffmpegthumbnailer 可以实现这一切,但这是另一个我不想依赖的库。我想要能够用 ffmpeg 实现。
有很多教程和资料展示了如何使用 ffmpeg 从视频中提取多个截图。你设置 -r 即可开始并连续获取。
但我只需要在某个特定时间点如01:23:45 或者在86%时获取1张截图。
使用 ffmpegthumbnailer 可以实现这一切,但这是另一个我不想依赖的库。我想要能够用 ffmpeg 实现。
-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: Seeking和ffmpeg
cli tool documentation中的摘录:
-ss
位置(输入/输出)当作为输入选项(在
-i
之前)使用时,将输入文件中的位置定位到此位置。请注意,在大多数格式中,不可能精确查找,因此ffmpeg
将在位置之前查找最近的查找点。当转码并启用-accurate_seek
(默认值)时,将解码和丢弃查找点和位置之间的额外段。进行流复制或使用-noaccurate_seek
时,它将被保留。当作为输出选项(在输出文件名之前)使用时,解码但丢弃输入,直到时间戳达到位置。
位置可以是秒或
hh:mm:ss[.xxx]
格式。
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]
或以秒为单位的数字。如果你需要一个百分比,你需要事先计算视频的持续时间。
-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
vframes
已经过时。根据手册,“[vframes
]是'-frames:v
'的过时别名,您应该使用它代替。” - Synexis