如何在给定时间使用ffmpeg为视频提取1个屏幕截图?

时间:2014-12-19 14:40:48

标签: video ffmpeg

有许多教程和内容展示了如何使用ffmpeg从视频中提取多个屏幕截图。你设置-r,你甚至可以开始一定的数量。

但我只想要1个屏幕截图,比如说01:23:45 in。或者1个截图是86%in。

ffmpegthumbnailer这是可能的,但这是我不想依赖的另一个依赖。我希望能够用ffmpeg做到这一点。

2 个答案:

答案 0 :(得分:133)

使用-ss选项:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • 对于JPEG输出,请使用-q:v来控制输出质量。全范围是1-31的线性标度,其中较低的值导致更高的质量。 2-5是一个很好的尝试范围。

  • select filter为更复杂的需求提供了另一种方法,例如只选择某些帧类型,或者每100个1等等。

  • 在输入之前放置-ss会更快。请参阅FFmpeg Wiki: Seeking以及ffmpeg cli tool documentation

  • 中的摘录
  

-ss位置(输入/输出)

     

当用作输入选项(-i之前)时,在此输入文件中寻找位置。请注意,在大多数格式中,无法进行搜索   确切地说,ffmpeg将寻求之前最接近的寻找点   位置。当转码和-accurate_seek启用时(   默认),搜索点和位置之间的这个额外段将   被解码和丢弃。在进行流复制时或何时进行   使用了-noaccurate_seek,它将被保留。

     

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

     

位置可以是以秒为单位,也可以是hh:mm:ss[.xxx]形式。

答案 1 :(得分:25)

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