Ich habe FFmpeg verwendet, um alle I-Frames aus einer MKV/MP4-Datei zu extrahieren, aber FFmpeg scheint dafür alle Frames zu dekodieren, sodass es sehr lange dauert, wenn die Videodatei 1080p groß und länger als 10 Minuten ist. Ich möchte nur, dass es von I-Frame zu I-Frame springt und sie in JPG/PNG-Dateien ausgibt. Außerdem muss ich den Zeitstempel des I-Frames kennen.
Die andere Möglichkeit bestand darin, FFprobe zu verwenden, um Zeitstempel für alle I-Frames zu erhalten, wodurch jedoch auch die gesamte Datei dekodiert wird.
Ich versuche, etwas Ähnliches wie Avidemux zu machen. In Avidemux können Sie sehr schnell zu jedem I-Frame springen, indem Sie einfach die Auf- oder Ab-Pfeiltasten drücken, aber dies geschieht, ohne alle B/P-Frames zu dekodieren.
Antwort1
Verwenden
ffmpeg -skip_frame nokey -i file -vsync 0 -frame_pts true out%d.png
skip_frame
weist den Decoder an, nur Keyframes zu verarbeiten. -vsync 0
(in diesem Befehl) behält Zeitstempel bei. -frame_pts
legt den numerischen Teil des Ausgabebilddateinamens so fest, dass er den Zeitstempel darstellt. Für die Interpretation der Zahl müssen Sie die Bildrate kennen. Wenn die Bildrate beispielsweise 30 beträgt, entspricht ein Bildname von out75 einem Zeitstempel von 75/30 = 2,50 Sekunden. Sie können hinzufügen, -r 1000
wenn Sie möchten, dass Zahlen Millisekunden darstellen.