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?