Erstellen Sie ein Video mit 5 Bildern mit FadeIn / Out-Effekt in ffmpeg

27

Mit 5 Bildern muss ich ein Video von 60 Sekunden in ffmpeg erstellen, jedes Bild muss 15 Sekunden lang angezeigt werden. Nach 15 Sekunden muss das erste Bild ausgeblendet und das zweite Bild eingeblendet werden. Nach dem Ausblenden des zweiten Bildes muss das dritte Bild eingeblendet werden. Bitte führen Sie mich, wie ich dies mit ffmpeg-Befehlen erreichen kann.

user384847
quelle
4
Was haben Sie versucht und dann können wir Ihnen helfen? Dieses Forum ist kein "Bitte gib mir die Antwort, ohne etwas zu tun" -Forum. Vor diesem
Hintergrund

Antworten:

49

Nach schwarz tauchen / verblassen

Scrollen Sie für die Überblendmethode nach unten.

verblassen Beispiel

Beispiel, in dem jedes Bild 5 Sekunden lang angezeigt wird und jedes eine Überblendung von 1 Sekunde hat. Jeder Bildeingang hat die gleiche Breite, Höhe und das gleiche Seitenverhältnis. Wenn sie unterschiedlich groß sind, siehe Beispiel 3 unten.

MP4-Ausgang

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Mit Audio

Wie oben, jedoch mit Audio:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Für Eingabebilder mit variierenden oder willkürlichen Größen

Wie das erste Beispiel, jedoch mit Eingabebildern, die sich in Breite x Höhe unterscheiden. Sie werden so gepolstert, dass sie in eine Box mit einer Größe von 1280 x 720 passen:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Sehen Sie sich die Beispiele unter Ändern der Größe von Videos an, um sie in einen Player mit statischer Größe zu passen, wenn Sie anstelle eines Pads (Letterbox / Pillarbox) einen Ausschnitt erstellen (den Bildschirm ausfüllen) oder eine Hochskalierung verhindern möchten.

GIF-Ausgabe

Fügt die Filter von Wie konvertiere ich ein Video mit ffmpeg in GIF mit angemessener Qualität?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Verwenden Sie die -loopAusgabeoption, um die Anzahl der GIF-Schleifen zu steuern. Standard ist Endlosschleife, wenn diese Option nicht verwendet wird. Ein Wert von -1ist keine Schleife.

Verwendete Optionen und Filter:

  • -t um die Dauer in Sekunden für jeden Eingang einzustellen.

  • -loop 1 Schleifen Sie das Bild, da es sonst eine Dauer von 1 Frame hat.

  • -framerateum die Bildrate für die Eingabe festzulegen (Standardeinstellung, wenn nicht deklariert, ist 25). Nützlich für die Erstellung von GIF.

  • Skalieren Sie mit dem Pad , um die Eingabebilder in eine bestimmte, einheitliche Größe zu bringen (verwendet in Beispiel 3).

  • Ein- und Ausblenden. dist die Dauer der Überblendung. stist, wenn es anfängt.

  • concat , um jedes Bild zu verketten (oder zu "verbinden").

  • Format zur Ausgabe eines Chroma-Subsampling-Schemas, das mit nicht auf FFmpeg basierenden Playern kompatibel ist, wenn MP4 ausgegeben und mit libx264 codiert wird (der Standardcodierer für MP4-Ausgabe, wenn dies von Ihrem Build unterstützt wird).

  • Teilen , um Kopien einer Filterausgabe zu erstellen. Wird von den * -Filtern der Palette benötigt, um alles in einem Befehl auszuführen.

  • palettegen und paletteuse für das Bilden des nett aussehenden GIF.


Überblenden

Crossfade-Beispiel

Beispiel, in dem jedes Bild 5 Sekunden lang angezeigt wird und jedes eine Überblendung von 1 Sekunde hat. Jeder Bildeingang hat die gleiche Breite, Höhe und das gleiche Seitenverhältnis. Wenn sie unterschiedlich groß sind, passen Sie Beispiel 3 an.

MP4-Ausgang

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

Mit Audio

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Überblendung zwischen zwei Videos mit Audio

Wählen Sie aus jedem Eingang ein 5-Sekunden-Segment und fügen Sie eine 1-Sekunden-Überblendung hinzu:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

GIF-Ausgabe

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Verwenden Sie die -loopAusgabeoption, um die Anzahl der GIF-Schleifen zu steuern. Standard ist Endlosschleife, wenn diese Option nicht verwendet wird. Ein Wert von -1ist keine Schleife.

Logan
quelle
1
@LordNeckbeard, danke für diese Antwort, ich habe sie für ein anderes Beispiel verwendet. Haben verstand ich auch , dass die Zahl nach -tin -loop 1 -t 1 -i 001.pngdefiniert die Dauer des einzelnen Frames, und dass die Nummern T/in filter_complexBlock des Übergangs der Dauer definiert? Und wird die Rahmendauer in diesem Beispiel einschließlich der Übergangsdauer gezählt oder nicht?
cincplug
1
@Nisarg Das scheint nicht die vollständige Ausgabe zu sein, und ich bin mir nicht sicher, von welchem ​​Befehl es stammt, den beiden, die Sie zuvor angezeigt haben. Wie auch immer, füge es hinzu -preset ultrafast.
Logan
1
@ LordNeckbeard Ich muss eine Reihe von Bildern, Videoclips und eine Audiospur kombinieren, um eine einzelne Videodatei zu erstellen (vorzugsweise ogg, aber das ist an dieser Stelle weniger relevant). Außerdem muss ich einige Übergangseffekte zwischen benachbarten Bildern erstellen. Gibt es eine Möglichkeit, diese gesamte Aufgabe mit ffmpeg und / oder anderen Befehlszeilentools zu skripten? Ziel ist es, die Aufgabe über eine Befehlszeilenschnittstelle zu automatisieren.
Web User
1
@WebUser-Übergänge werden wahrscheinlich einfacher zu verwenden sein melt.
Logan
2
Der ffmpeg-Ansatz funktioniert gut für mich; Vielen Dank! Ein Tipp für Neulinge auf der Seite; im concat=n=9teil des befehls 9kommt das aus den 5 bildern im beispiel + 4 übergänge zwischen den bildern. Wenn Sie eine andere Anzahl von Bildern bearbeiten, müssen Sie diese entsprechend anpassen.
Jim Miller
4

Ich habe ein allgemeines Bash-Skript geschrieben, das einen Pfad zu einem Ordner mit Bildern aufnimmt und ein Crossfade-Video mit ffmpeg ausgibt:

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Das Skript betrachtet im Wesentlichen die Bilder in einem Ordner und druckt einen Befehl aus, der der Antwort von @LordNeckbeard oben ähnlich ist, und führt den Befehl aus. Dieses Skript hilft, wenn Sie viele Bilder in einem Ordner haben und nicht manuell einen bedrückend langen Befehl eingeben möchten.

anh_ng8
quelle
Entschuldigung, aber Ihr Skript schlägt mit ffmpeg 3.0.1 fehl. Mit den Eingaben 0 bis 4 wird Folgendes zurückgegeben: "Ungültiger Dateiindex 5 in der Filtergraph-Beschreibung"
Krzysztof Bociurko,
TobySpeight: Guter Punkt, ich habe die Antwort bearbeitet, um klarer zu sein. Grundsätzlich ist die Hauptidee bereits oben von @LordNeckbeard gegeben. Dieses Skript verallgemeinert nur auf viele Bilder.
anh_ng8