Wie extrahiere ich alle Keyframes aus einem Videoclip?

10

Ich versuche, Keyframes aus einem Videoclip zu extrahieren. Ich habe den folgenden Befehl ausprobiert, aber er extrahiert alle Frames.

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

Antworten:

20

Sie können die Verwendung -skip_frameohne selectVideofilter vereinfachen :

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
Radoh
quelle
2
Erstaunlich, dauert bei einem 20-minütigen Video weniger als 10 Sekunden im Vergleich zu mehr als 3 Minuten bei Auswahlfilter!
Verrückter
Stellen Sie sicher, dass ein Filtergraph ( ) auf meinem System im -threads 1Vergleich zum Standard 2x so schnell ist (60s bis 30s)! -threads autocropdetectffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null
Genpfault
Ich würde skip_frame nokey nicht verwenden. Haben Sie sogar die Ausgabe überprüft? Auf meinen Dateien und Builds (August 2019) erhalte ich falsche Zeitstempel, da mir in nokey der vorhergehende Frame vor dem I-Frame angezeigt wird, während die nicht gefilterten / alle Frames den I-Frame zu einem späteren Zeitpunkt anzeigen.
JasonXA
Der Grund, warum @genpfault die Verwendung vorschlägt, -threads 1besteht darin, dass die Reihenfolge der Ausgabe-Keyframes ansonsten nicht in der richtigen Reihenfolge ausgegeben werden kann. Wenn Sie eine Post-hoc- Methode zur Lösung dieses Problems haben, können Sie das Multithreading beibehalten. Es scheint auch, dass es immer noch möglich ist, Keyframes außerhalb der Reihenfolge zu erhalten, selbst wenn sie verwendet -threads 1 werden. In diesem Fall scheinen alle derartigen Vorkommnisse von einem h264-Decoderfehler begleitet / gekennzeichnet zu sein illegal short term buffer state detected.
Glenn Slayden
12

Beispiel mit den Filtern selectund scale:

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

Einige Tipps:

  • Filter sollten nicht vor der -iOption stehen, da sie eine Ausgabeoption sind. Ich weiß nicht genau, woher Sie den Befehl haben, aber er PICT_TYPE_Iexistiert nicht - er sollte es sein I.

  • Im scaleFilter können Sie ersetzen 73oder 41den Filter automatisch die Breite oder Höhe berechnen lassen, um das Seitenverhältnis beizubehalten: wie scale=73:-1oder scale=-1:41. Dies verhindert ein Dehnen oder Quetschen, das aus einer "erzwungenen" Skalierung resultieren kann.

  • Die Ausgabequalität kann mit -qscale:v(oder dem Alias -q:v) gesteuert werden . Der effektive Bereich ist eine lineare Skala von 2 bis 31 und ein niedrigerer Wert ist eine höhere Qualität.

  • Dass Sie ffmpegeinen Filter zulassen, bevor die Eingabe mir sagt, dass er veraltet sein könnte. Laden Sie einen aktuellen statischen Build für Ihr Betriebssystem herunter oder erstellen Sie ihn selbst gemäß den Kompilierungshandbüchern, wenn dies nicht funktioniert.

slhck
quelle
1
Wenn Sie die Keyframes verlustfrei extrahieren möchten, können Sie Folgendes versuchen:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier
0

wenn dieser Fehler:

Die Option vf (Videofilter festlegen) kann nicht auf die Eingabe-URL 1508.mp4 angewendet werden. Sie versuchen, eine Eingabeoption auf eine Ausgabedatei anzuwenden oder umgekehrt. Verschieben Sie diese Option vor die Datei, zu der sie gehört. Fehler beim Parsen der Optionen für die Eingabedatei 1508.mp4. Fehler beim Öffnen der Eingabedateien: Ungültiges Argument

du kannst das:

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

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

"-I" Parameter im Voraus

Tom
quelle