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-copyts
e 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 -itsoffset
easetpts
Também tentei usar -itsoffset
para mudar as trilhas de vídeo. Isso funcionou, mas -itsoffset
nã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 oasetpts
filtropara 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 -ss
as entradas de áudio, aplicar aresample=async=1,atrim=225.398
a cada entrada de áudio e então mixar esses fluxos filtrados.
225.398
é 224.1+1.298
- seu ss
valor + 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.