Primer intento, usando-copyts

Primer intento, usando-copyts

Estoy intentando superponer dos videos con diferentes horas de inicio y mezclar sus pistas de audio.

Estos archivos de entrada son grabaciones WebRTC y cada uno contiene una única pista de audio o vídeo.

Entradas:

  • RTc0.webm: audio, Opus 40k, tiempo de inicio 9.078 seg.
  • RT5f.webm: audio, Opus 40k, tiempo de inicio 1.262 seg.
  • RT8c.mkv: vídeo, H.264, tiempo de inicio 9.078 seg.
  • RTf7.mkv: vídeo, H.264, tiempo de inicio 1.298 seg.

Quiero dibujar estos videos uno al lado del otro y mezclar su audio.

Primer intento, usando-copyts

Mi idea inicial fue utilizar-copytsy simplemente permita que todo se alinee usando su código de tiempo común compartido.

Mi línea de comando se ve así:

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

Al ejecutar esto, obtengo una salida donde el video es correcto (un video comienza en 0 segundos, el otro comienza 7 segundos después), pero ambas pistas de audio comienzan en 0 segundos. El comportamiento esperado es que una pista de audio comience en 0 segundos y la otra comience 7 segundos después, sincronizada con la segunda pista de video.

Segundo intento, usando -itsoffsetyasetpts

También intenté usar -itsoffsetpara cambiar las pistas de video. Esto funcionó pero -itsoffsetno hizo nada con mis pistas de audio. Tenía efectos extraños, a veces ponerlo en uno los desplazaba a ambos en el tiempo.

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

Luego intenté usar elasetptsfiltrarpara cambiar la pista de audio para preservar la alineación, pero no funcionó. El comando asetpts=PTS+(7.816/TB)simplemente fue ignorado:

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

¿Qué estoy haciendo mal?

Respuesta1

El filtro amix sincroniza todas las entradas para que comiencen al mismo tiempo. La solución es omitir -sslas entradas de audio, aplicarlas aresample=async=1,atrim=225.398a cada entrada de audio y luego mezclar esas transmisiones filtradas.

225.398es 224.1+1.298: su ssvalor + hora de inicio de la transmisión de video de inicio anterior. He usado el valor de la transmisión de video ya que el audio correspondiente comienza antes, por lo que puedes perder la sincronización si usas su valor.

información relacionada