有许多教程和资料显示了如何使用ffmpeg从视频中提取多个屏幕截图。您设置-r,甚至可以开始一定数量。
但是我只想在例如01:23:45 in处获得1个屏幕截图。或者在86%in处获得1个屏幕截图。
使用ffmpegthumbnailer可以实现所有功能,但这是我不想依赖的另一个依赖。我希望能够使用ffmpeg做到这一点。
有许多教程和资料显示了如何使用ffmpeg从视频中提取多个屏幕截图。您设置-r,甚至可以开始一定数量。
但是我只想在例如01:23:45 in处获得1个屏幕截图。或者在86%in处获得1个屏幕截图。
使用ffmpegthumbnailer可以实现所有功能,但这是我不想依赖的另一个依赖。我希望能够使用ffmpeg做到这一点。
Answers:
使用-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:寻求以及ffmpeg
cli工具文档中的以下摘录:
-ss
位置(输入/输出)当用作输入选项(之前
-i
)时,在此输入文件中查找以定位。请注意,大多数格式都无法精确查找,因此ffmpeg
将搜索到位置之前最接近的搜索点。-accurate_seek
启用转码并启用(默认设置)后,搜寻点和位置之间的此额外片段将被解码并丢弃。在进行流复制或-noaccurate_seek
使用时,将保留它。当用作输出选项时(在输出文件名之前),将解码但丢弃输入,直到时间戳到达位置为止。
位置可以是秒,也可以是
hh:mm:ss[.xxx]
形式。
vframes
(至少)在4.2.2版中已作废。根据手册,“ [ vframes
]是' -frames:v
' 的过时别名,应改为使用。
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]
以秒的形式或形式接受一个值。如果需要百分比,则需要事先计算视频时长。
ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg
。请注意,正如其他人所建议的那样,我还在命令行上的输入文件之前放置了-ss
“搜索”选项。