Primeira tentativa, usando-copyts

Primeira tentativa, usando-copyts

Estou tentando sobrepor dois vídeos com horários de início diferentes e mixar suas faixas de áudio.

Esses arquivos de entrada são gravações WebRTC e cada um contém uma única trilha de áudio ou vídeo.

Entradas:

  • RTc0.webm: áudio, Opus 40k, hora de início 9,078 seg.
  • RT5f.webm: áudio, Opus 40k, hora de início 1,262 seg.
  • RT8c.mkv: vídeo, H.264, hora de início 9,078 seg.
  • RTf7.mkv: vídeo, H.264, hora de início 1,298 seg.

Quero desenhar esses vídeos lado a lado e mixar seu áudio.

Primeira tentativa, usando-copyts

Meu pensamento inicial foi usar-copytse apenas permitir que tudo se alinhe usando seu timecode comum compartilhado.

Minha linha de comando se parece com:

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

Executando isso, obtenho uma saída onde o vídeo está correto (um vídeo começa em 0 segundos, outro começa 7 segundos depois), mas ambas as trilhas de áudio começam em 0 segundos. O comportamento esperado é que uma trilha de áudio comece em 0 segundos e a outra comece 7 segundos depois, sincronizada com a segunda trilha de vídeo.

Segunda tentativa, usando -itsoffseteasetpts

Também tentei usar -itsoffsetpara mudar as trilhas de vídeo. Isso funcionou, mas -itsoffsetnão fez nada nas minhas faixas de áudio. Tinha efeitos estranhos, às vezes, colocando-o como um, mudava os dois no tempo.

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

Eu então tentei usar oasetptsfiltropara mudar a trilha de áudio para preservar o alinhamento, mas não funcionou. O comando asetpts=PTS+(7.816/TB)foi simplesmente 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

O que estou fazendo de errado?

Responder1

O filtro amix sincroniza todas as entradas para iniciar ao mesmo tempo. A maneira de contornar é pular -ssas entradas de áudio, aplicar aresample=async=1,atrim=225.398a cada entrada de áudio e então mixar esses fluxos filtrados.

225.398é 224.1+1.298- seu ssvalor + hora de início do stream de vídeo inicial. Usei o valor do stream de vídeo porque o áudio correspondente começa mais cedo, então você poderá perder a sincronização se usar esse valor.

informação relacionada