2012-01-30 136 views
7

我需要需要从视频/ Stream.So提取关键帧没有任何标准执行。 我正在使用公开简历。 (目前我提取帧每秒这是我需要慢来提高性能。) 因此,如果任何一个已经优化的实施,请在这里回复。关键帧提取从视频

回答

12

使用的ffmpeg,你可以用下面的代码中提取的所有关键帧:

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i yourvideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg 

接下来室颤的ffmpeg的命令行是描述FilterGraph动态。选择过滤器选择要通过输出的帧。过滤器的常量是“pict_type”和值“PICT_TYPE_I”。所以ffmpeg只是将关键帧传递给输出。

-vsync 2防止FFMPEG以产生用于每个关键帧多于一个拷贝。

-f图像2写入视频帧的图像文件。输出文件名由一个模式指定,可用于生成顺序编号的一系列文件。该模式可能包含字符串“%d”或“%0Nd”。

参考: http://www.videoproductionslondon.com/blog/scene-change-detection-during-encoding-key-frame-extraction-code

+0

如何在opencv中完成它? – Treper 2013-02-25 09:16:20

+1

我得到'未定义常量或缺失'('在'PICT_TYPE_I'') – puk 2013-12-18 19:14:45

+1

您好!这是一个有价值的命令,但是它的顺序是错误的,你也可能重新调整图像的大小。你应该先把-i video.mp4放到其他地方。它如下所示:ffmpeg -i“yourInputVideo.mp4”-vf select =“eq(pict_type \,PICT_TYPE_I)”-vsync 2 -f image2 thumbnail_%02d.jpeg – 2014-10-21 00:57:45

6

我会假设关键帧是一个框架,呈现的内容与以前的很不一样(它不是一个正式的定义,但它适合)。取帧I + 1。使用cv2.absDiff来计算帧和cv2.sumElems之间的差异以获得所有像素差的总和。为所有框架做这个i。这会将您的视频流减少到一维信号。在该信号中寻找峰值,并选择与这些峰值相对应的关键帧。

+0

我得到一个标量从sumElems()的RGB值返回。如何处理这个标量最聪明的方式?求和RGB通道?只专注于某个频道? – sschrass 2012-03-05 13:08:20

+0

求和RGB通道或仅使用灰度。 – 2012-03-06 00:48:32

+0

你可以分享一个示例代码来找到峰值框架 – geek 2017-04-04 05:43:20

1

FFmpeg的解决方案应该很好地工作。

对于遇到选择过滤器'eq(pict_type \,PICT_TYPE_I)'问题的用户,您可能需要将过滤器设置为'eq(pict_type \,I)'。这被打破了一段时间,所以ffmpeg的某些版本可能无法识别该常量。修复可以看到here

它终于为我工作的最后一个命令是:

ffmpeg -vf select='eq(pict_type\,I)' -i yourVideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg 
2

如果有毛病上面的代码,试试这个参数顺序相反。

ffmpeg -i yourVideo.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg 
0

您可以使用ffprobe来提取关键帧。它是ffmpeg中的一个工具。

ffprobe in.mp4 -select_streams v -show_entries frame = key_frame,pkt_pts_time -of csv = nk = 1:p = 0 | FINDSTR “1”,

+0

需要更多信息 – 2017-06-07 09:52:59