FFMPEG extrahiert Intra-Frames I,P,B-Frames

FFMPEG extrahiert Intra-Frames I,P,B-Frames

Gibt es eine Möglichkeit, die Intra-Frames zu extrahieren und sie so wie sie sind aus FFMPEG oder einem ähnlichen Programm zu erhalten? Ich weiß, dass man Frames mit in eine JPEG-Bildsequenz extrahieren kann -f image2. Aber das sind vollständige Bilder von jedem der Frames. Ich möchte nur das Bild der Bewegungsänderung exportieren, also würde ich die P- und B-Frames haben, die nur die Bewegungsänderung zeigen und den unveränderten Bereich der Bilder ausschließen oder maskieren.

Ist das möglich?

Der grundlegende Frame-Exportbefehl, den ich verwende. Damit erhalte ich von jedem Frame Vollbilder mit der angegebenen FPS.

ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg

Ich möchte die Frames so exportieren, dass ich einen Ordner mit Frames habe, in dem der erste Frame ein vollständiges Bild ist und der nächste Frame nur die Bilddaten enthält, bei denen das Bild neu gezeichnet werden muss. Aufdeckung der zeitlichen Redundanz zwischen den beiden Frames (ist das nicht das, was I-, P- und B-Frames tun?)

Antwort1

Um einen bestimmten Rahmentyp zu extrahieren, verwenden Sie dieselectFilter:

select=eq(pict_type\,<x>)

wobei <x>einer der folgenden Werte ist:pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI

Also zum Beispiel:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4

Um mehr über die Ausgabe zu erfahren, fügen Sie dieshowinfoFilter:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4

Antwort2

P- und B-Frames enthalten normalerweise nicht für jeden der geänderten Bereiche neue Bilddaten. Das Bild wird vielmehr in Makroblöcke unterschiedlichen Typs aufgeteilt. Einige Arten von Makroblöcken enthalten neue Bilddaten, die meisten berechnen den Inhalt jedoch auf der Grundlage anderer Referenzbilder und Bewegungsvektoren.

Das ist nicht genau das, was Sie wollten, aber hier wird der Typ jedes Makroblocks durch Farben angezeigt:

ffmpeg -debug vis_mb_type -i input.mp4 output.mp4

oder

ffplay -debug vis_mb_type input.mp4

Dadurch werden Ihnen auch die Bewegungsvektoren angezeigt:

ffplay -debug vis_mb_type -vismv 7 input.mp4

Weitere Informationen zu den Farben der einzelnen MB finden Sie unter dem Link:

Debuggen von Makroblöcken und Bewegungsvektoren FFMpeg-Dokumentation

verwandte Informationen