2012-01-30 114 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