2017-03-02 5 views
0

Mit einem beliebigen Quellvideo möchte ich während des Videos zu verschiedenen Zeiten mindestens drei .png Overlays/Wasserzeichen UNABHÄNGIG ein- und ausblenden. Ich habe Probleme, die Syntax für die Filterkette richtig zu machen.Wie blende ich unabhängig voneinander mehrere (3+) Overlay-Bilder über Video mit FFMPEG ein/aus?

Bei diesen fehlgeschlagenen Versuchen verwende ich vier transparente .png-Bilder alle bei 1920x1080 mit dem gleichen Quell-Eingangsvideo. Es ist keine Skalierung/Positionierung erforderlich, nur die Überlagerungen werden zu definierten Zeiten ein- und ausgeblendet.

Ich habe die Funktionalität ohne Fade arbeiten, unsing 'enable', etwa so:

ffmpeg -i vid1.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
"overlay=0:0:enable='between(t,8,11)' [tmp]; 
[tmp]overlay=0:0:enable='between(t,10,15)'[tmp1]; 
[tmp1]overlay=0:0:enable='between(t,15,138)'[tmp2]; 
[tmp2]overlay=0:0:enable='between(t,140,150)" 
-c:v libx264 -c:a copy 
-flags +global_header -shortest -s 1920x1080 -y out.mp4 

Ich möchte nur die gleiche Steuerung, mit Fade-in/out.

Die folgenden fast funktioniert, wie ich möchte, aber ich will natürlich nicht den gesamten Ausgangsstrom ausblenden. Ich bemerke, dass das Hinzufügen der Fade = out zu Linien 7, 8 & 9 verblasst die kombinierte Ausgabe (beginnend bei Zeile 7), aber das ist so nah wie ich gekommen bin, wo ich sehe, dass jedes Overlay-Bild tatsächlich verblassen. Die definierten Überblendungen in den Zeilen 3, 4 und 5 beeinflussen scheinbar nichts, und dort habe ich sie ursprünglich definiert. Wenn ich sie in den Ausgabestream kopiere, funktioniert die Überblendung für jedes Überlagerungsbild, aber ich möchte nicht, dass sie den gesamten Ausgabestrom beeinflusst, sondern nur die einzelnen Überlagerungen.

ffmpeg -i vid1.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
    "[1:v]fade=out:st=3:d=1[watermark0]; 
    [2:v]fade=out:st=4:d=1[watermark1]; 
    [3:v]fade=out:st=5:d=1[watermark2]; 
    [4:v]fade=out:st=6:d=1[watermark3]; 
    [0:v][watermark0] overlay=0:0 [tmp0]; 
    [tmp0][watermark1] overlay=0:0,fade=out:st=4:d=1 [tmp1]; 
    [tmp1][watermark2] overlay=0:0,fade=out:st=6:d=1 [tmp2]; 
    [tmp2][watermark3] overlay=0:0,fade=out:st=8:d=1 [out]" -map "[out]" -c:v libx264 -c:a copy 
    -flags +global_header -shortest -s 1920x1080 -y out.mp4 

Ich habe auch versucht, ‚split‘ mit ähnlichen Ergebnissen wie oben, aber die verblassen scheint nur auf dem ersten Bild zu arbeiten (dies verwendet Einblendung auch):

ffmpeg -i vid.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
"[1:v]split=4[wm1][wm2][wm3][wm4]; 
[wm1]fade=in:st=1:d=1:alpha=1,fade=out:st=3:d=1:alpha=1[ovr1]; 
[wm2]fade=in:st=2:d=1:alpha=1,fade=out:st=4:d=1:alpha=1[ovr2]; 
[wm3]fade=in:st=3:d=1:alpha=1,fade=out:st=5:d=1:alpha=1[ovr3]; 
[wm4]fade=in:st=4:d=1:alpha=1,fade=out:st=6:d=1:alpha=1[ovr4]; 
[0:v][ovr1]overlay=0:0[base1]; 
[base1][ovr2]overlay=0:0[base2]; 
[base2][ovr3]overlay=0:0[base3]; 
[base3][ovr4]overlay=0:0[out]" -map "[out]" 
-t 10 -c:v libx264 -c:a copy -flags +global_header -shortest -s 1920x1080 -y out.mp4 

Jede Hilfe wird sehr geschätzt! :)

Antwort

0

Verwenden

ffmpeg -i vid.mp4 -loop 1 -i img1.png -loop 1 -i img2.png -loop 1 -i img3.png 
     -loop 1 -i img4.png -filter_complex 
"[1]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+12/TB[ovr1]; 
[2]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+25/TB[ovr2]; 
[3]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+44/TB[ovr3]; 
[4]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+73/TB[ovr4]; 
[0:v][ovr1]overlay=0:0:enable='between(t,12,15)'[base1]; 
[base1][ovr2]overlay=0:0:enable='between(t,25,28)'[base2]; 
[base2][ovr3]overlay=0:0:enable='between(t,44,47)'[base3]; 
[base3][ovr4]overlay=0:0:enable='between(t,73,76)'[out]" -map "[out]" 
-c:v libx264 -c:a copy -flags +global_header -shortest -s 1920x1080 -y out.mp4 

Eine einzelne Bildeingabe, wenn nicht geschleift wird als ein Videoeingang eines Rahmens behandelt. Ich habe Schleifen zu den anderen Bildern hinzugefügt. Dies macht jeden Eingang zu einem Videostream von unbestimmter Dauer.

Für jedes Bild wird ein Ein- und Ausblenden angewendet. Nehmen Sie für die Zeitwerte hier an, dass Sie sich am Anfang der Streams anmelden. Der Zeitversatz für die Überlagerungen tritt später auf. Nach den Überblendungen trimmen Sie den Stream, um das Video nur so lange zu behalten, bis das Ausblenden beendet ist. Wenden Sie dann einen Zeitversatz an, um den Start für das Overlay zu erreichen (um ein Bild zu überlagern, das bei 33 Sekunden beginnt, ist es).

Dann die Overlays in Serie, genau wie Sie bereits getan haben. Ich habe die Aktivierungsbedingung hinzugefügt, um die Ausführungszeit zu verkürzen.

+0

Das funktioniert gut - ich verliere jedoch den Ton im Ausgangsvideo. Muss das separat zugeordnet werden oder wie schließe ich das Quellvideo des primären Videos ein? Danke für die Hilfe! – blahblahber

+0

Ja, füge '-map 0: a' hinzu – Mulvya

0

erstens danke für deine antwort und code es hat mir enorm geholfen mit zu basteln. Ich habe meinen eigenen Code gepostet (nimm zur Kenntnis, dass ich kein FFMPEG Experte bin wie du). Meine Aufgabe war es, 3 Paar Titel über ein 20,760 Sekunden Video ein- und auszublenden - die Titel waren transparente PNGs. Von Ihrem ursprünglichen Code habe ich folgendes gemacht:

a. Alle "enable (t, start, end)" auf "enable (t, 0,999)" geändert, so dass sie nicht angepasst oder berücksichtigt werden müssen (wenn Ihr Video kürzer als 999 Sekunden ist) b. Verwendete absolute Ein- und Ausblendmethoden für jedes Bild. Obwohl die Bearbeitungszeit länger ist, können Sie die absolute End- und Anfangszeit jedes Titels einstellen. c. Es wurde -t 20.760 hinzugefügt, was die Gesamtlänge des zugrunde liegenden Videos darstellt, für das Titel hinzugefügt werden sollen.Dies verhindert eine Endlosschleife.

ffmpeg -i sourcevideo.mp4 -loop 1 -i servtit1.png -loop 1 -i servtit2.png -loop 1 -i servtit3.png -loop 1 -i servtit4.png -loop 1 -i servtit5.png -loop 1 -i servtit6.png -filter_complex 
"[1]fade=t=in:st=0.5:d=1,fade=t=out:st=2.5:d=1[ovr1]; 
[2]fade=t=in:st=2.5:d=1,fade=t=out:st=4.44:d=1[ovr2]; 
[3]fade=t=in:st=6.8:d=1,fade=t=out:st=9.6:d=1[ovr3]; 
[4]fade=t=in:st=9.6:d=1,fade=t=out:st=12.4:d=1[ovr4]; 
[5]fade=t=in:st=12.5:d=1,fade=t=out:st=15.2:d=1[ovr5]; 
[6]fade=t=in:st=15.2:d=1,fade=t=out:st=17.9:d=1[ovr6]; 
[0:v][ovr1]overlay=0:0:enable='between(t,0,999)'[base1]; [base1] 
[ovr2]overlay=0:0:enable='between(t,0,999)'[base2]; [base2] 
[ovr3]overlay=0:0:enable='between(t,0,999)'[base3]; [base3] 
[ovr4]overlay=0:0:enable='between(t,0,999)'[base4]; [base4] 
[ovr5]overlay=0:0:enable='between(t,0,999)'[base5]; [base5] 
[ovr6]overlay=0:0:enable='between(t,0,999)'[out]" -map "[out]" -c:v libx264 -c:a copy -flags +global_header -t 20.760 -shortest -y outputvideo.mp4 

Nochmals vielen Dank für die Unterstützung.

Verwandte Themen