Ich versuche, zwei Videos mit unterschiedlichen Startzeiten übereinander zu legen und ihre Audiospuren zu mischen.
Diese Eingabedateien sind WebRTC-Aufzeichnungen und enthalten jeweils eine einzelne Audio- oder Videospur.
Eingänge:
RTc0.webm
: Audio, Opus 40k, Startzeit 9,078 Sek.RT5f.webm
: Audio, Opus 40k, Startzeit 1,262 Sek.RT8c.mkv
: Video, H.264, Startzeit 9,078 Sek.RTf7.mkv
: Video, H.264, Startzeit 1,298 Sek.
Ich möchte diese Videos nebeneinander zeichnen und ihren Ton zusammenmischen.
Erster Versuch mit-copyts
Mein erster Gedanke war,-copyts
und lassen Sie einfach alles anhand des gemeinsamen Zeitcodes ausrichten.
Meine Kommandozeile sieht so aus:
ffmpeg \
-copyts \
-ss 224.1 -i RTc0.webm -t 60 \
-ss 224.1 -i RT5f.webm -t 60 \
-ss 224.1 -i RTf7.mkv -t 60 \
-ss 224.1 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a][0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
Wenn ich dies ausführe, erhalte ich eine Ausgabe, bei der das Video korrekt ist (ein Video startet bei 0 Sekunden, eines startet 7 Sekunden später), aber beide Audiospuren starten bei 0 Sekunden. Das erwartete Verhalten ist, dass eine Audiospur bei 0 Sekunden startet und die andere 7 Sekunden später, synchronisiert mit der zweiten Videospur.
Zweiter Versuch, mit -itsoffset
undasetpts
Ich habe auch versucht, -itsoffset
die Videospuren zu verschieben. Das hat funktioniert, aber -itsoffset
bei meinen Audiospuren hat es nichts bewirkt. Es hatte seltsame Effekte, manchmal wurden beide Spuren zeitlich verschoben, wenn ich es für eine Spur einsetzte.
ffmpeg \
-ss 0.00000000 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.816 -i RT5f.webm -t 60 \
-ss 0.00000000 -itsoffset 0 -i RTc0.webm -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[0:v] scale=640x480 [left];
[1:v] scale=640x480 [right];
[background][left] overlay=shortest=1 [background+left];
[background+left][right] overlay=shortest=1:x=640 [vout];
[2:a][3:a] amix=inputs=2:duration=longest [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
Ich habe dann versucht, mit demasetpts
Filterum die Audiospur zu verschieben, um die Ausrichtung beizubehalten, aber es hat nicht funktioniert. Der Befehl asetpts=PTS+(7.816/TB)
wurde einfach ignoriert:
ffmpeg \
-copyts \
-ss 0 -i RTc0.webm -t 60 \
-ss 0 -i RT5f.webm -t 60 \
-ss 0 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a] asetpts=PTS+(7.816/TB), [0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska segment_0.mkv
Was mache ich falsch?
Antwort1
Der Amix-Filter synchronisiert alle Eingänge, damit sie gleichzeitig starten. Der Umweg besteht darin, die Filterung -ss
für die Audioeingänge zu überspringen, aresample=async=1,atrim=225.398
auf jeden Audioeingang anzuwenden und dann diese gefilterten Streams mit Amix zu mischen.
225.398
ist 224.1+1.298
- Ihr ss
Wert + Startzeit des früher startenden Videostreams. Ich habe den Wert des Videostreams verwendet, da der entsprechende Ton früher startet. Wenn Sie also dessen Wert verwenden, kann die Synchronisierung verloren gehen.