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


10

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

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

Answers:


20

您可以简化此操作,-skip_frame而无需select视频过滤器:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg

2
惊人的是,在20分钟的视频中只需不到10秒的时间,而选择过滤器则需要3分钟以上的时间!
疯狂

确保使用-threads 1,与默认值相比,-threads auto它使cropdetect过滤器图表(ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null)在我的系统上的速度快2倍(从60秒降低到30秒)!
genpfault

我不会使用skip_frame nokey。您甚至检查输出了吗?在我的文件和构建中(2019年8月),我得到了不正确的时间戳,因为在nokey中,我在I帧之前给了我前一帧,而未过滤/所有帧在以后的时间戳中显示了I帧。
JasonXA

@genpfault建议使用的原因-threads 1是,否则输出关键帧的序列可能会无序发出。如果您有某种事后的方式来解决此问题,则可以保留多线程。同样,即使使用 -threads 1,似乎仍然有可能获得乱序的关键帧,但是现在在这种情况下,所有此类情况似乎都伴随着h264解码器错误/带有标志illegal short term buffer state detected
凌晨

12

使用selectscale过滤器的示例:

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

一些提示:

  • 过滤器不应-i作为选项,因为它们是输出选项。我不知道您从哪里确切地获得命令,但是PICT_TYPE_I不存在-应该是I

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

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

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


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

0

如果此错误:

选项vf(设置视频过滤器)无法应用于输入网址1508.mp4-您正在尝试将输入选项应用于输出文件,反之亦然。将此选项移到它所属的文件之前。输入文件1508.mp4的错误解析选项。打开输入文件时出错:无效的参数

你可以这样做:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

预先“ -i”参数

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.