Erster Versuch mit-copyts

Erster Versuch mit-copyts

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,-copytsund 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 -itsoffsetundasetpts

Ich habe auch versucht, -itsoffsetdie Videospuren zu verschieben. Das hat funktioniert, aber -itsoffsetbei 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 demasetptsFilterum 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 -ssfür die Audioeingänge zu überspringen, aresample=async=1,atrim=225.398auf jeden Audioeingang anzuwenden und dann diese gefilterten Streams mit Amix zu mischen.

225.398ist 224.1+1.298- Ihr ssWert + 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.

verwandte Informationen