Überblendung zwischen 2 Videos mit ffmpeg

27

Ich habe versucht, mit ffmpeg einen Überblendungsübergang zwischen zwei Videoclips zu erzielen, bin aber bisher gescheitert. Ich bin neu bei ffmpeg und verlasse mich hauptsächlich darauf, die Dokumentation und die vorhandenen Beispiele online zu optimieren. Nach dem, was ich bisher gelesen habe, sollte die Verwendung des Überblendungs- oder Überlagerungsfilters helfen, das zu erreichen, wonach ich suche, aber ich kann die Befehlszeilendetails nicht herausfinden, um es zum Laufen zu bringen.

Die verblasst und concat Filter sind für die Einblendung von Video 1, Fade-In auf Video 2 und Concat der 2 in 1 Clip Übergängen Typen , aber ich würde Hilfe schätzen , einen Befehl zum Übergang von Video 1 bis Video 2 ohne in immer werde zwischendurch schwarz . Ich konnte nirgendwo Beispiele für genau dieses Problem finden. Vielleicht suche ich nach den falschen Stichwörtern ...?

Insbesondere sind meine Videos mp4s (h264 Video, kein Ton, falls es darauf ankommt), jede ist 5 Sekunden lang und ich bin nach einem Übergang von ca. 4,5s von Video 1 bis 0,5s von Video 2.

Ähnlich wie in diesem Tutorial mit MLT und Frames (siehe 2:25 für ein Beispiel-Fade), obwohl ich nach einer Möglichkeit suche, dies nur in ffmpeg zu tun, ohne andere Progs aufzurufen. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Alle Zeiger oder vielleicht eine Befehlszeile, um eine solche Überblendung zu erhalten, wären sehr dankbar, vielen Dank!

Mugba
quelle

Antworten:

23

Ich schlage vor, dies so zu tun:

  • Erstellen Sie einen schwarzen Hintergrund mit der gleichen Dauer und Auflösung wie das ausgegebene Video
  • Füge jedem Video einen Alpha-Kanal hinzu
  • Fügen Sie jedem Video einen Alpha-Effekt hinzu
  • Verwenden Sie Overlay für jedes Video mit schwarzem Hintergrund

Der Befehl zum Hinzufügen von Überblendungen zu jeweils 2 Videos (5 Sek.) Sollte also lauten:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Dadurch wird das erste Video in der 4. Sekunde (st = 4) während 1 Sekunde (d = 1) auf Alpha ausgeblendet, in der 1. Sekunde (d = 1) bei 0 Sekunden (st = 0) eingeblendet und die Anzeige verschoben Zeitvorlauf auf 4 Sek. (+ 4 / TB). Dann schneiden wir nur 9 Sekunden der schwarzen Farbe, skalieren sie, um die Videogröße auszugeben, und überlagern das Material.

Ich hoffe es hilft.

ptQa
quelle
Hallo @ptQa, vielen Dank, der Überblendeffekt wirkt wie ein Zauber. Im Ausgabevideo wird jedoch nur ein oberer linker Abschnitt der Originalvideos angezeigt, und der Rest des Frames fehlt. Ich habe mir die Auflösung angesehen, die Eingabe ist 960 x 720 und die Ausgabe ist 320 x 240, aber es wird nicht das gesamte Video verkleinert, sondern ein Abschnitt von 320 x 240 oben links ausgeschnitten und der Rest des Ausgangsvideos angezeigt Die eingegebenen Videos fehlen. Gibt es eine Ergänzung zu Ihrer Befehlszeile, die dies verhindert?
Mugba
Oh, ich verstehe, Sie sollten auch die schwarze Farbe auf die Auflösung skalieren, die Sie erhalten möchten. Siehe aktualisierte Antwort. Ich habe dem Filterdiagramm eine Skalierung hinzugefügt.
ptQa
Das hat es gelöst, danke. Ich habe ein Beispielvideo hochgeladen, das das Überblenden zeigt, falls jemand es in Aktion sehen möchte. Youtu.be/JqorgXAjjTo
Mugba
Gleiches Problem; Ich habe eine Variante davon, die an einigen meiner eigenen Videos arbeitet - danke. Frage: Wie würde dies geändert, um auch die Audiospuren der Videos nach demselben Muster wie die Videoüberblendung zu überblenden?
Jim Miller
1
BTW, ich denke, es gibt einen Fehler im Beispielbefehl der Antwort - es sollte sein -i 1.mp4 -i 2.mp4..., richtig?
Jim Miller
7

So habe ich es gemacht:

  • ffmpeg-Version N-77197-gdf2ce13
  • 2 Videos zu je 4 Sekunden.
  • Müssen Sie es mit Fade zwischen ihnen verbinden.
  • Videos sind 25 fps.

1) Fügen Sie am Ende des 1. die Option Ausblenden (hell nach dunkel) hinzu und am Anfang des 2. die Option Einblenden (dunkel nach hell):

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 bedeutet, das Ausblenden startet Bild 76 und endet 24 Bilder später = 1s Ausblenden.

0:25 bedeutet, dass das Einblenden mit Bild 0 beginnt und 25 Bilder später endet.

2) Füge die 2 Videos zusammen

Konvertieren Sie alle in TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Verschmelzen

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Dank an:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php

Erwan
quelle
6
Dies ist keine Überblendung.
Gyan
4
Was @ Mulvya gesagt hat. Eine Überblendung blendet einen Clip gleichzeitig mit dem Einblenden eines anderen Clips aus. Die Transparenz des ersten Clips wird über die Dauer der Überblendung stetig erhöht. Die Transparenz des zweiten hat stetig abgenommen.
intuited
7

ffmpeg-concat ist der einfachste Weg, um das zu erreichen, was Sie wollen, und ermöglicht Ihnen die Verwendung einer Reihe sexy OpenGL-Übergänge, wobei der Standard Crossfade ist.

Der ffmpeg-gl-Übergang ist ein benutzerdefinierter ffmpeg-Filter, mit dem Sie mithilfe von GLSL reibungslos zwischen zwei Videoströmen wechseln können. Dieser Filter ist erheblich einfacher zu verwenden und anzupassen als die hier aufgeführten Alternativen.

Dieser Filter unterstützt eine große Liste von Übergangstypen, wobei der Standard Crossfade ist.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4
fisch2
quelle
4
Hast du darüber nachgedacht, einen Patch an FFmpeg zu senden?
Logan
1
Ich werde es definitiv tun, ich muss nur ein paar kleine Probleme beheben und erst mehr testen. Guter Anruf!
Fisch2
steht das im offiziellen FFmpeg? Ich kann es anscheinend nicht finden
kraftydevil