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 :)
Hier ist also, was ich mir ausgedacht habe.
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:
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).r
(Abtastrate) sollte mit der der Audiospuren der Videos übereinstimmen, die Sie verketten möchten.cl
(Kanallayout) sollte auch mit dem Ton Ihrer Videos übereinstimmenDie Ausgabeparameter (z. B. Codecs) sollten denen Ihrer Videos entsprechen. Stellen Sie -t
mit die Länge (in Sekunden) des leeren Clips ein.
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:
-i
) an, die wir verketten werden-filter_complex
), den wir verwenden, um:
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.concat
Filters. 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.map
die endgültige Ausgabe an die Ausgabeströme aus dem Concat-FilterWichtige Notizen:
s
und n
(Video) oder ss
und ns
(Audio) verwenden. Weitere Informationen finden Sie in der Dokumentation zu Afade und Fade - Filtern.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 null
und anull
gefiltert, um ihnen Outpad-Tags zu geben, um konsistente Identifikatoren im concat
Filter zu verwenden. Aber das ist rein optional.
Hoffe, das hilft, fühlen Sie sich frei, meine Lösung mit Ihren Erkenntnissen zu verbessern :)
Gyan