Wie verkettet man mehrere Videos mit Überblendungen (von und nach Schwarz) dazwischen?

Ich hatte vor kurzem folgendes Problem:

Ich wollte mit ffmpeg mehrere Videos (mit Audio) verketten, schwarze Clips (mit Null-Audio) dazwischen einfügen und schließlich die Videos von diesen schwarzen Clips ( Einblendung ) und diesen schwarzen Clips ( Ausblendung ) ausblenden. .

Schematisch, z. B. mit 2 Videos:

black (1s) --> part_1 (60s) --> black (3s) --> part_2 (120s) --> black (1s)
            ^                ^              ^                 ^
       (2s-fade-in)     (2s-fade-out)  (2s-fade-in)      (2s-fade-out)

Ich suchte nach einer Einzeiler-Lösung (um zu vermeiden, dass Originalvideos mehr als einmal neu codiert werden), fand aber nur Dokumentation oder Hilfe für jeden Teil des Problems.

Nachdem ich es herausgefunden hatte, wollte ich meine Lösung für diejenigen nach mir dokumentieren, die auf ein ähnliches Problem stoßen werden :)

Antworten (1)

Hier ist also, was ich mir ausgedacht habe.

Eine nicht ganz einzeilige Lösung

1) Generieren Sie schwarze Clips

ffmpeg -f lavfi -i "color=black:s=1920x1080:r=30" \
 -f lavfi -i "anullsrc=r=48000:cl=stereo" \
 -c:v libx264 -c:a aac -t 3 empty_3s.mp4

Verwenden Sie Lavfi-Filter , um Ihren leeren Clip zu generieren. Ändern Sie die Parameter natürlich entsprechend Ihren Videos und dem, was Sie erreichen möchten. Besonders:

  • im ersten (Video-)Quellenfilter:
    • s(Größe) sollte mit dem der Videos übereinstimmen, die Sie verketten möchten.
    • r(Bildrate) sollte auch zu Ihren Videos passen (insbesondere, wenn Sie eine konstante Bildratenausgabe wünschen).
  • im zweiten (Audio-)Quellenfilter:
    • r(Abtastrate) sollte mit der der Audiospuren der Videos übereinstimmen, die Sie verketten möchten.
    • cl(Kanallayout) sollte auch mit dem Ton Ihrer Videos übereinstimmen

Die Ausgabeparameter (z. B. Codecs) sollten denen Ihrer Videos entsprechen. Stellen Sie -tmit die Länge (in Sekunden) des leeren Clips ein.

2) Verketten und verblassen Sie Ihre Videos mit einem komplexen Filterdiagramm

ffmpeg -i empty_1s.mp4 -i part_1.mp4 -i empty_3s.mp4 -i part_2.mp4 -i empty_1s.mp4 \
 -filter_complex \
  "[1:v] fade=t=in:st=0:d=2, fade=t=out:st=58:d=2 [1v]; \
   [1:a] afade=t=in:st=0:d=2, afade=t=out:st=58:d=2 [1a]; \
   [3:v] fade=t=in:st=0:d=2, fade=t=out:st=118:d=2 [3v]; \
   [3:a] afade=t=in:st=0:d=1, afade=t=out:st=118:d=2 [3a]; \
   [0:v] [0:a] [1v] [1a] [2:v] [2:a] [3v] [3a] [4:v] [4:a] concat=n=5:v=1:a=1 [v] [a]" \
 -map "[v]" -map "[a]" -c:v libx264 -c:a aac output.mp4

Erläuterung:

  • Wir geben zuerst die Eingaben ( -i) an, die wir verketten werden
  • Dann setzen wir einen komplexen Filter ( -filter_complex), den wir verwenden, um:
    • blenden Sie zuerst unsere Videos ein und aus . Zu diesem Zweck verwenden wir die Filter fade(für Video) und afade(für Audio). Wir geben Start ( st) und Dauer ( d) für jeden Fade an. Wir geben die Ergebnisse mit Outpad-Namen ( [1v], [1a]...) aus.
    • Verketten Sie dann die schwarzen Clips und die zuvor ausgeblendeten Videos mithilfe des concatFilters. Wir spezifizieren die Anzahl der Eingabesegmente n(dh die Anzahl der Video+Audio-Sätze, in unserem Fall 5), die wir verketten möchten, und die Anzahl der Video- ( v=1) und Audio- ( a=1) Streams für die Ausgabe.
  • wir mapdie endgültige Ausgabe an die Ausgabeströme aus dem Concat-Filter
  • Geben Sie die Codierungsparameter an, was Sie wollen :)

Wichtige Notizen:

  • Ihre Videos (Eingänge) müssen die gleichen Eigenschaften haben (Pixel- und Abtastformat für Video, Abtastrate und Kanallayout für Audio). Weitere Informationen finden Sie in der concat -Dokumentation .
  • im Fade-Filter geben wir Startzeit und Dauer in Sekunden an, aber Sie können auch Frames oder Samples mit den Optionen sund n(Video) oder ssund ns(Audio) verwenden. Weitere Informationen finden Sie in der Dokumentation zu Afade und Fade - Filtern.
  • Sie müssen die Dauer Ihrer Videos für den Fade-Filter kennen, insbesondere für Fade-Outs. In dieser Frage finden Sie Hinweise dazu , wie zwei Clips ausgeblendet werden, ohne dass die Startzeit manuell angegeben werden muss.

Echter Einzeiler

Wenn Sie wirklich einen Einzeiler wollen (und keine leeren schwarzen Clips codieren müssen), können Sie Folgendes verwenden:

ffmpeg \
 -f lavfi -t 1 -i "color=black:s=1920x1080:r=30" -f lavfi -t 1 -i "anullsrc=r=48000:cl=2" \
 -i part_1.mp4 \
 -f lavfi -t 3 -i "color=black:s=1920x1080:r=30" -f lavfi -t 3 -i "anullsrc=r=48000:cl=2" \
 -i part_2.mp4 \
 -f lavfi -t 1 -i "color=black:s=1920x1080:r=30" -f lavfi -t 1 -i "anullsrc=r=48000:cl=2" \
 -filter_complex \
  "[0:v] null [0v]; [1:a] anull [0a]; [3:v] null [2v]; [4:a] anull [2a]; \
   [6:v] null [4v]; [7:a] anull [4a]; \
   [2:v] fade=t=in:st=0:d=2, fade=t=out:st=58:d=2 [1v]; \
   [2:a] afade=t=in:st=0:d=2, afade=t=out:st=58:d=2 [1a]; \
   [5:v] fade=t=in:st=0:d=1, fade=t=out:st=118:d=2 [3v]; \
   [5:a] afade=t=in:st=0:d=1, afade=t=out:st=118:d=2 [3a]; \
   [0v] [0a] [1v] [1a] [2v] [2a] [3v] [3a] [4v] [4a] concat=n=5:v=1:a=1 [v] [a]" \
 -map "[v]" -map "[a]" -c:v libx264 -c:a aac output.mp4

In diesem Fall müssen wir uns vor den Eingabeindizes in Acht nehmen , da schwarze Videoclips und Null-Audioclips getrennte Eingaben sind (ich habe nicht herausgefunden, wie ich sie als zwei Streams in eine einzige Eingabe einfügen kann, wenn Sie eine Idee haben, können Sie sie gerne teilen es).

Hier habe ich diese Eingaben angewendet nullund anullgefiltert, um ihnen Outpad-Tags zu geben, um konsistente Identifikatoren im concatFilter zu verwenden. Aber das ist rein optional.

Hoffe, das hilft, fühlen Sie sich frei, meine Lösung mit Ihren Erkenntnissen zu verbessern :)

Sie müssen keine separaten Quellfiltereingaben für die Null-Video- und -Audiosegmente generieren. Sie können im filter_complex mehrfach verwendet werden.