Key Frame Extraktion aus dem Video

7

Ich brauche Key Frames aus Video / Stream extrahieren. Gibt es eine Standardimplementierung? Ich verwende einen offenen Lebenslauf. (Momentan extrahiere ich Frames pro Sekunde, was langsamer ist, ich muss die Performance verbessern.) Wenn jemand eine optimierte Implementierung hat, antworten Sie bitte hier.

    
user1178178 30.01.2012, 13:56
quelle

5 Antworten

12

Mit ffmpeg können Sie alle Schlüsselbilder mit dem folgenden Code extrahieren:

%Vor%

Was folgt -vf in einer ffmpeg-Befehlszeile ist eine Filtergraph-Beschreibung. Der Auswahlfilter wählt Frames aus, die in der Ausgabe übergeben werden sollen. Die Konstante des Filters ist "pict_type" und der Wert "PICT_TYPE_I". Also gibt ffmpeg nur Schlüsselbilder an den Ausgang.

-vsync 2 verhindert, dass ffmpeg mehr als eine Kopie für jeden Schlüsselrahmen generiert.

-f image2 schreibt Videoframes in Bilddateien. Die Ausgabedateinamen werden durch ein Muster angegeben, mit dem sequenziell nummerierte Dateireihen erstellt werden können. Das Muster kann die Zeichenfolge "% d" oder "% 0Nd" enthalten.

Referenz: Ссылка

    
Munarriz 02.03.2012, 10:50
quelle
6

Ich gehe davon aus, dass ein keyframe ein Frame ist, dessen Inhalt sich sehr von den vorherigen unterscheidet (es ist keine formale Definition, aber es passt). Nehmen Sie Frames i und i + 1 . Verwenden Sie cv2.absDiff , um den Unterschied zwischen den Frames und cv2 zu berechnen. sumElems , um die Summe aller Pixelunterschiede zu erhalten. Tun Sie dies für alle Frames i . Dadurch wird Ihr Videostream auf ein eindimensionales Signal reduziert . Suchen Sie in diesem Signal nach Peaks und wählen Sie Keyframes aus, die diesen Peaks entsprechen.

    
TH. 31.01.2012 11:57
quelle
2

Wenn etwas mit dem obigen Code nicht stimmt, versuchen Sie stattdessen diese Argumentreihenfolge.

%Vor%     
backing 14.11.2014 06:05
quelle
1

Die ffmpeg-Lösung sollte gut funktionieren.

Wenn jemand Probleme mit dem Auswahlfilter 'eq (pict_type \, PICT_TYPE_I)' hat, sollten Sie den Filter als 'eq (pict_type \, I)' ausprobieren. Dies wurde für eine Weile unterbrochen, sodass einige Versionen von ffmpeg die Konstante möglicherweise nicht erkennen. Das Update kann hier gesehen werden.

Der letzte Befehl, der für mich funktionierte, war:

%Vor%     
sanchitarora 12.02.2014 21:58
quelle
0

Sie können ffprobe verwenden, um Schlüsselbilder zu extrahieren. Es ist ein Werkzeug in ffmpeg.

ffprobe in.mp4 -select_streams v -show_entries frame = schlüssel_rahmen, pkt_pts_time-of csv = nk = 1: p = 0 | findstr "1,"

    
user7925034 07.06.2017 09:35
quelle