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

Pet*_*son 85 video ffmpeg

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

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

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

llo*_*gan 156

使用-ss选项:

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

  • 所述选择滤波器提供了更复杂的需求的另一种方法,诸如选择仅某些帧类型,或1每100等

  • -ss在输入之前放置会更快.请参阅FFmpeg Wiki:ffmpegcli工具文档中寻找和摘录:

-ss 位置(输入/输出)

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

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

位置可以是秒或hh:mm:ss[.xxx]表格.

  • 请注意,“vframes”(至少)在 4.2.2 版本中已过时。根据手册,“[`vframes`] 是 '`-frames:v`' 的过时别名,您应该使用它。” (4认同)
  • 这要快得多。非常感谢。将-ss放在首位会有很大的不同。 (2认同)

Sir*_*ius 28

FFMpeg可以通过寻找给定的时间戳并将一帧精确地提取为图像来实现此目的,例如:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg
Run Code Online (Sandbox Code Playgroud)

我们来解释一下选项:

-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
Run Code Online (Sandbox Code Playgroud)

-ss参数接受表单中的值HH:MM:SS[.xxx]或以秒为单位的数字.如果您需要百分比,则需要事先计算视频时长.

  • 尝试在-i之前使用-ss选项,因为它将跳过管道的解码部分.这可能会加速这个过程. (4认同)
  • @NickeManarin 是的..`ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg`。请注意,正如其他人所建议的那样,我还在命令行上的输入文件之前添加了“-ss”“seek”选项。 (3认同)
  • 有没有办法将 PNG 输出到流而不是文件? (2认同)