Was ist ein effizienter Weg, um eine Video-Überblendung mit FFmpeg durchzuführen?

11

Das Überblenden von zwei Videoinhalten ist in FFmpeg eigentlich ziemlich kompliziert. Es gibt keinen "Überblend" -Filter wie für Audio.

Was ist ein effizienter Weg, um es zu tun?

Mark Gerolimatos
quelle
Schöne selbst beantwortete Frage!
JakeGould
Diese Antwort muss viel mehr Upvotes bekommen ... Mark, ich würde dich für immer so lieben, wenn du Cross-Fading auch für das Audio hinzufügen würdest ...
Merc
Sobald ich herausgefunden habe, wie, werde ich es hinzufügen. Ich denke, Audio-Überblendung ist ein Kinderspiel, aber glauben Sie, dass es einen einfachen Filter dafür gibt.
Mark Gerolimatos
Ich habe einfach [0:a][1:a] acrossfade=d=1 [audio]zum Filter und dann -map "[audio]" zum Befehl hinzugefügt und es hat funktioniert. Wenn Sie möchten, testen Sie es und aktualisieren Sie die Antwort!
Merc
Mögliches Duplikat der Überblendung zwischen 2 Videos mit ffmpeg
r_alex_hall

Antworten:

17

TL; DR-Version:

In diesem Beispiel wird nur Video ausgeführt, vorausgesetzt, beide Videoclips haben dieselbe Auflösung, Bildrate usw. Dadurch wird zwischen Fadeoutclip und Fadeinclip eine 1-Sekunden-Überblendung erstellt. Angenommen, der Fadeoutclip ist 10 Sekunden lang. Beachten Sie, dass dies aus Gründen der Übersichtlichkeit formatiert ist: Es handelt sich wirklich um eine Codezeile.

ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an \
-filter_complex "\
    [0:v]trim=start=0:end=9,setpts=PTS-STARTPTS[firstclip]; \
    [1:v]trim=start=1,setpts=PTS-STARTPTS[secondclip]; \
    [0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
    [1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
    [fadeinsrc]format=pix_fmts=yuva420p, \
                fade=t=in:st=0:d=1:alpha=1[fadein]; \
    [fadeoutsrc]format=pix_fmts=yuva420p, \
                fade=t=out:st=0:d=1:alpha=1[fadeout]; \
    [fadein]fifo[fadeinfifo]; \
    [fadeout]fifo[fadeoutfifo]; \
    [fadeoutfifo][fadeinfifo]overlay[crossfade]; \
    [firstclip][crossfade][secondclip]concat=n=3[output] \
    " \
-map "[output]" <add in encoding part here>

Vollversion:

Hier ist eine Erklärung, worum es ging:

Eingabespezifikation ... offensichtlich

ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an

Erstellen eines filter_complex: vorausgesetzt, Sie verstehen bereits Filterkomplexe:

-filter_complex

Zuerst teilen wir die beiden Streams mithilfe des Trimmfilters in zwei Teile : den Inhalt und den Überblendungsabschnitt. Das Ausblenden wird in Inhalt und Ausblendabschnitt unterteilt, während das Einblenden in den Ausblendabschnitt und den Inhalt geschnitten wird. Insgesamt vier Abschnitte.

Beachten Sie, dass streng genommen, wissen wir nicht haben Sie die Cross - Fade - Abschnitte zu brechen: Wir konnten nur die Fade - Out und Fade - in - Zeiten für die beiden Videoclips festlegen. Auf diese Weise können wir jedoch:

In jedem dieser vier Abschnitte werden Folgendes angegeben: Startzeit (Sekunden), Endzeit (Sekunden) und der mysteriöse setpts=PTS-STARTPTSFilter , mit dem jeder Video-Subclip im Wesentlichen bei 0 Sekunden beginnt. Dies ist wichtig, wenn Sie sie neu zusammensetzen.

Beachten Sie, dass die s=0Spezifizierer redundant sind und der setptsFilter für diese s=0AUCH redundant ist. Beide werden jedoch redundant angegeben, um eine Änderung der Startzeit von 0 zu ermöglichen, ohne den Filterkomplex zu unterbrechen. Außerdem wird der zweite Inhaltsclip bis zum Ende ausgeführt, sodass der e=Teil (end =) nicht angegeben wird.

    [0:v]trim=s=0:e=9,setpts=PTS-STARTPTS[firstclip];
    [1:v]trim=s=1,setpts=PTS-STARTPTS[secondclip];
    [0:v]trim=s=9:e=10,setpts=PTS-STARTPTS[fadeoutsrc];
    [1:v]trim=s=0:e=1,setpts=PTS-STARTPTS[fadeinsrc];

Als Nächstes geben wir das Ein- und Ausblenden an: Zunächst fügen wir beiden Einblendabschnitten einen Alpha-Kanal (Transparenzkanal) hinzu, indemyuva420p wir ein Pixelformat von angeben . Sie können tatsächlich jedes Format verwenden, das einen Alphakanal bereitstellt.

Als nächstes wird in diesem Filter Subkomplex wir eine angeben heraus zu verblassen, und ein verblassen in. Die alpha=1bedeutet , dass das Video selbst nicht verdunkeln wird, wird nur die Transparenz Menge wird „fade“. stbedeutet Start, dbedeutet Dauer.

    [fadeinsrc]format=pix_fmts=yuva420p,      
                fade=t=in:st=0:d=1:alpha=1[fadein];
    [fadeoutsrc]format=pix_fmts=yuva420p,
                fade=t=out:st=0:d=1:alpha=1[fadeout];

Was ist das?: Der fifoFilter stellt sicher, dass im Filterkomplex Pufferplatz verfügbar ist. Erstaunlicherweise ist dies NICHT die Standardeinstellung. Wenn Sie dies nicht tun, kann die Überblendung fehlschlagen, wenn die Ausgabe der obigen Stufe den unteren Überlagerungsfilter überschreitet. Ja, ich weiß, was Sie gerade denken. Es ist in der Tat ein FFMPEG-Fehler .

    [fadein]fifo[fadeinfifo];
    [fadeout]fifo[fadeoutfifo];

Überlagern Sie nun die beiden Überblendungsabschnitte: Indem Sie sicherstellen, dass die beiden Überblendungsabschnitte dieselbe Größe haben, müssen wir uns keine Gedanken über die ziemlich unangenehmen Optionen machen, die der Überlagerungsfilter bietet (und ignorieren sie daher hier):

    [fadeoutfifo][fadeinfifo]overlay[crossfade];

Schließlich richten wir unsere drei Segmente mit dem Concat-Filter aus .

    [firstclip][crossfade][secondclip]concat=n=3[output]

Und jetzt ordnen Sie das Ausgabefeld als Ihre Videoquelle zu.

VERGESSEN SIE NICHT, das Pixelformat auf das einzustellen, was Sie normalerweise verwenden (normalerweise yuv420p), da der Überblendungsabschnitt es yuv420auf dem Ausgangskanal eingestellt hat! (Da wir es nicht angegeben haben, können Sie die Overlay-Argumente verwenden.) Wenn Sie WOLLEN yuv420, geht es Ihnen natürlich gut :-)

-map "[output]" <add your normal encoding part here>

Sie können Audio später erneut kombinieren (außerhalb des Bereichs dieser Fragen und Antworten).

Mark Gerolimatos
quelle
1
In der neuesten ffmpeg muss es sein trim=start=0:end=9, (anstatt trim=st=0:e=9,..
Merc
Aber im Ernst, dies muss die beste Antwort auf FFMPEG sein, die ich je gesehen habe, und die klarste Erklärung für ffmpeg, die es je gab.
Merc
Mann, das geht mir in den Kopf :-) Danke für die Requisiten !!!!
Mark Gerolimatos
Keine Bange. Bitte aktualisieren Sie die Antwort insbesondere mit = trim = start = 0, da sie derzeit nicht mit dem neuesten ffmpeg
Merc
Die neueste ffmpeg-Version gibt mir diesen Fehler: Filter setpts has an unconnected outputfür das Skript. Ich habe die Trimmparameter bereits auf Start und Ende geändert.