![Aneinanderfügen mehrerer Videos (mit Audio) durch Überblenden](https://rvso.com/image/1568491/Aneinanderf%C3%BCgen%20mehrerer%20Videos%20(mit%20Audio)%20durch%20%C3%9Cberblenden.png)
Ich habe 7 kurze Videoclips, die alle dieselbe Größe, Bildrate usw. haben. Ich möchte sie mit einer 2-Sekunden-Überblendung nacheinander aneinanderreihen und dabei den Ton nicht verlieren. Aus einem früheren Beitrag hier habe ich versucht, nur die ersten beiden anzuhängen/überzublenden, und zwar mit:
ffmpeg -i *clip1.mp4 -i *clip2.mp4 \
-filter_complex "[0]fade=t=out:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va0]; \
[1]fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va1]; \
[va0][va1]overlay[outv];[0][1]amix[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4
Dies erzeugt jedoch ein Video, das das erste Video sofort ausblendet und am Ende genau dieselbe Länge hat wie das zweite Video (das zufällig 40 Sekunden lang ist). Ich nehme an, dass dies an „st=0“ für das erste Video [0] liegt? Wenn ich das jedoch in „st=18“ ändere (das erste Video ist 20 Sekunden lang), wird das erste Video im resultierenden kombinierten Video (out.mp4) immer noch sofort ausgeblendet (und das gesamte Video ist immer noch nur 40 Sekunden lang statt 58). Der Ton für das erste Video dauert jetzt jedoch 18 Sekunden (aber er überlagert jetzt das zweite Video und dessen Ton für 18 Sekunden). Irgendwelche Vorschläge, was ich versuchen könnte?
Antwort1
Beim Zusammenfügen von Clips mit Überblendungen müssen Sie auf zwei Dinge achten: Wenden Sie die Überblendung zum richtigen Zeitpunkt und vom richtigen Typ an und verzögern Sie die Video-Zeitstempel, sodass in der endgültigen Montage jedes Video zur richtigen Zeit startet.
In diesem Fall ist Ihr erstes Video 20 Sekunden lang, Ihr zweites Video 40 Sekunden und Sie möchten eine Überblendung von 2 Sekunden. Wenn wir Überblendungen mit dem Overlay-Filter ausführen, müssen wir nur Einblendungen auf das eingehende Video anwenden. Wenn wir eine Ausblendung auf das ausgehende Video anwenden, entsteht ein Luminanzabfall – manchmal erwünscht, aber ich vermeide das.
Also wenden wir zunächst eine 2s-Überblendung anInzu Beginn des zweiten Videos.
[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];
Da die Überblendung nur auf den Alphakanal angewendet wird, muss das Video einen Alphakanal haben. Normalerweise haben Videos keinen, daher wird vor der Überblendung ein Pixelformat-Konvertierungsfilter angewendet, um das Pixelformat des zweiten Videos in ein Format mit Alpha zu ändern - beachten Sie das a
in yuva444p
. Eine Überblendung vom Typ in
wird ab Zeit 0
und mit Dauer 2s
auf denAlphakanalNur die Farbpixel des Videos werden nicht beeinflusst.
Nun soll das 2. Video verzögert werden. Da das 1. Video 20s lang ist und eine 2s Überblendung gewünscht wird, soll das 2. Video bei 18s innerhalb der Montage starten. Also wird der setpts-Filter angewendet
setpts=PTS-STARTPTS+18/TB
Der TB bezeichnet dieZeitbasisund ist die Einheit, in der Zeitstempel für einen Stream gespeichert werden.
Für Audio-Crossfades gibt es einen Acrossfade-Filter
[0][1]acrossfade=d=2
Dadurch wird eine Überblendung von 2 Sekunden eingestellt.
Nun können wir die beiden Clips zusammenfügen,
ffmpeg -i *clip1.mp4 -i *clip2.mp4 \
-filter_complex \
"[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1]; \
[0][va1]overlay[outv];[0][1]acrossfade=d=2[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4