如何从视频剪辑中提取所有关键帧?

Ras*_*afa 14 ffmpeg

我正在尝试从视频剪辑中提取关键帧。我尝试了以下命令,但它提取了所有帧。

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg
Run Code Online (Sandbox Code Playgroud)

rad*_*doh 24

您可以-skip_frame在不需要select视频过滤器的情况下使用更简单:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
Run Code Online (Sandbox Code Playgroud)

  • 令人惊叹,20 分钟的视频只需不到 10 秒,而选择过滤器则需要超过 3 分钟! (2认同)
  • 请添加解释为什么“-vsync 0”对此任务很重要。我不知道它做了什么,最终得到了很多重复的 jpeg,因为输出与输入的帧速率匹配,并且您需要“-vsync 0”选项来避免这种情况 (2认同)

slh*_*hck 12

使用selectscale过滤器的示例:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg
Run Code Online (Sandbox Code Playgroud)

一些提示:

  • 过滤器不应该出现在-i选项之前,因为它们是一个输出选项。我不知道你到底从哪里得到命令,但PICT_TYPE_I不存在——它应该是I.

  • scale过滤器中,您可以替换7341让过滤器自动计算宽度或高度以保持纵横比:例如scale=73:-1scale=-1:41。这可以防止因“强制”缩放而导致的拉伸或挤压。

  • 可以使用-qscale:v(或别名-q:v)控制输出质量。有效范围是 2 到 31 的线性刻度,较低的值表示较高的质量。

  • ffmpeg在输入之前允许过滤器告诉我它可能已过时。为您的操作系统下载最新的静态构建,如果上述方法不起作用,则根据编译指南自行构建。

  • 如果您的目标是无损提取关键帧,您可以尝试以下操作:`ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png` (4认同)