![Abdunklung/Ausblende zu Schwarz](https://rvso.com/image/1428745/Abdunklung%2FAusblende%20zu%20Schwarz.png)
Mit 5 Bildern muss ich in ffmpeg ein 60 Sekunden langes Video erstellen, jedes Bild muss 15 Sekunden lang angezeigt werden. Nach 15 Sekunden muss das erste Bild ausgeblendet und das zweite Bild eingeblendet werden, danach muss das zweite Bild ausgeblendet, das dritte Bild eingeblendet werden usw. Bitte erklären Sie mir, wie ich dies mit ffmpeg-Befehlen erreichen kann.
Antwort1
Abdunklung/Ausblende zu Schwarz
Scrollen Sie nach unten, um zur Crossfade-Methode zu gelangen.
Beispiel: Jedes Bild wird 5 Sekunden lang angezeigt und hat jeweils eine Ausblendung von 1 Sekunde.Jeder Bildeingang weist die gleiche Breite, Höhe und das gleiche Beispiel-Seitenverhältnis auf.Wenn die Größe variiert, siehe Beispiel Nr. 3 unten.
MP4-Ausgabe
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, aber 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 unterschiedlichen oder beliebigen Größen
Wie das erste Beispiel, aber mit Eingabebildern, die in Breite x Höhe variieren. Sie werden aufgefüllt, um in ein 1280 x 720 großes Feld zu 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
Beispiele finden Sie inGrößenanpassung von Videos, damit sie in einen Player mit statischer Größe passenwenn Sie zuschneiden (den Bildschirm füllen) statt auffüllen (Letterbox/Pillarbox) möchten oder wenn Sie eine Hochskalierung verhindern möchten.
GIF-Ausgabe
Fügt die Filter vonWie konvertiere ich ein Video mit ffmpeg in angemessener Qualität in ein GIF?
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 -loop
Ausgabeoption, um die Anzahl der Schleifen des GIF zu steuern. Wenn diese Option nicht verwendet wird, ist die Standardeinstellung eine Endlosschleife. Der Wert -1
bedeutet keine Schleife.
Verwendete Optionen und Filter:
-t
um die Dauer jeder Eingabe in Sekunden festzulegen.-loop 1
Das Bild wird in einer Schleife wiedergegeben, andernfalls hätte es eine Dauer von 1 Frame.-framerate
um die Framerate des Eingabebildes einzustellen (Standard ist 25, wenn nicht deklariert). Nützlich für die Erstellung von GIFs.SkalamitUnterlageum die Eingabebilder auf eine bestimmte, einheitliche Größe zu bringen (verwendet in Beispiel Nr. 3).
verblassenzum Ein- und Ausblenden.
d
ist die Dauer der Überblendung.st
ist, wann sie beginnt.Verkettungum jedes Bild zu verketten (oder „zusammenzufügen“).
Formatum ein Chroma-Subsampling-Schema auszugeben, das mit nicht auf FFmpeg basierenden Playern kompatibel ist, wenn MP4 ausgegeben und mit libx264 codiert wird (der Standard-Encoder für MP4-Ausgabe, sofern dieser von Ihrem Build unterstützt wird).
Teiltum Kopien einer Filterausgabe zu erstellen. Wird von den Paletten*-Filtern benötigt, um alles mit einem Befehl zu erledigen.
PalettengenUndPalettengebrauchzum Erstellen gut aussehender GIFs.
Überblendung
Beispiel, bei dem jedes Bild 5 Sekunden lang angezeigt wird und jedes eine Überblendung von 1 Sekunde hat.Jeder Bildeingang weist die gleiche Breite, Höhe und das gleiche Beispiel-Seitenverhältnis auf.Wenn die Größe variiert, passen Sie Beispiel Nr. 3 oben an.
MP4-Ausgabe
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
Überblenden zwischen zwei Videos mit Audio
Wählen Sie von jedem Eingang ein 5-Sekunden-Segment aus 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 -loop
Ausgabeoption, um die Anzahl der Schleifen des GIF zu steuern. Wenn diese Option nicht verwendet wird, ist die Standardeinstellung eine Endlosschleife. Der Wert -1
bedeutet keine Schleife.
Antwort2
Ich habe ein allgemeines Bash-Skript geschrieben, das einen Pfad zuein Ordner mit Bildern, und gibt ein Crossfade-Video mit ffmpeg aus:
https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e
Das Skript betrachtet im Wesentlichen die Bilder in einem Ordner, druckt einen Befehl aus, der der Antwort von @LordNeckbeard oben ähnelt, und führt den Befehl aus. Dieses Skript ist hilfreich, wenn Sie viele Bilder in einem Ordner haben und keinen deprimierend langen Befehl manuell eingeben möchten.