Abdunklung/Ausblende zu Schwarz

Abdunklung/Ausblende zu Schwarz

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 für ein Fade-Beispiel

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 -loopAusgabeoption, um die Anzahl der Schleifen des GIF zu steuern. Wenn diese Option nicht verwendet wird, ist die Standardeinstellung eine Endlosschleife. Der Wert -1bedeutet keine Schleife.

Verwendete Optionen und Filter:

  • -tum die Dauer jeder Eingabe in Sekunden festzulegen.

  • -loop 1Das Bild wird in einer Schleife wiedergegeben, andernfalls hätte es eine Dauer von 1 Frame.

  • -framerateum 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. dist die Dauer der Überblendung. stist, 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

Crossfade-Beispiel

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 -loopAusgabeoption, um die Anzahl der Schleifen des GIF zu steuern. Wenn diese Option nicht verwendet wird, ist die Standardeinstellung eine Endlosschleife. Der Wert -1bedeutet 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.

verwandte Informationen