Tentando sobrepor vídeos com diferentes horários de início

0

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

Esses arquivos de entrada são gravações WebRTC e cada um contém uma única faixa 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

Eu quero desenhar esses vídeos lado-a-lado e misturar o áudio deles.

Primeiro, tente usar -copyts

Meu pensamento inicial foi usar -copyts e permitir que tudo fosse alinhado usando seus recursos comuns compartilhados timecode.

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, recebo uma saída onde o vídeo está correto (um vídeo começa em 0 segundos, um começa 7 segundos depois), mas ambas as trilhas de áudio começam em 0 segundo. O comportamento esperado é que uma faixa de áudio começa aos 0 segundos e a outra começa 7 segundos depois sincronizada com a segunda faixa de vídeo.

Segunda tentativa, usando -itsoffset e asetpts

Eu também tentei usar -itsoffset para mudar as trilhas de vídeo. Isso funcionou, mas -itsoffset não fez nada pelas minhas faixas de áudio. Teve efeitos estranhos, às vezes colocando-os para um deslocado 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

Em seguida, tentei usar o asetpts filter para deslocar a faixa de áudio para preservar o alinhamento, mas isso não aconteceu trabalhos. O comando asetpts=PTS+(7.816/TB) foi 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?

    
por bcattle 30.03.2018 / 10:37

1 resposta

2

O filtro amix sincroniza todas as entradas para iniciar ao mesmo tempo. É possível pular o -ss para as entradas de áudio, aplicar aresample=async=1,atrim=225.398 a cada entrada de áudio e, em seguida, compor os fluxos filtrados.

225.398 é 224.1+1.298 - seu ss valor + hora de início do fluxo de vídeo inicial anterior. Eu usei o valor do stream de vídeo, já que o áudio correspondente é iniciado mais cedo, então você pode perder a sincronia se usou seu valor.

    
por 30.03.2018 / 12:44