Nestes dias de COVID, nosso diretor de coral está gravando um vídeo que é o acompanhamento, e então cada membro do coral (em casa) está ouvindo o acompanhamento em fones de ouvido, cantando junto e gravando sua voz e rosto adorável como um vídeo. Agora quero pegar todos esses vídeos díspares e combiná-los em um vídeo com todos os membros em pequenos painéis, estilo Brady Bunch. E, claro, cada membro do coral tem um hardware diferente, então os níveis de áudio são todos diferentes e precisam ser normalizados. E, claro, uma pessoa levou o vídeo de lado (retrato em vez de paisagem), então o vídeo deve ser cortado antes de adicioná-lo.
Eu tenho funcionado principalmente, minha linha de comando é assim (simplificada):
ffmpeg -y -i "Director.MOV"
-i "Member1.MOV"
-i "Member2.mp4"
-filter_complex "
nullsrc=size=1920x1080 [base];
[0:v] scale=960x540 [clip0];
[0:a]volume=1[aud0];
[1:v] crop=1080:1000:0:920,scale=583x540 [clip1];
[1:a]volume=2[aud1];
[2:v] scale=960x540 [clip2];
[2:a]volume=1.1[aud2];
[base][clip0] overlay=shortest=1:x=0:y=0 [tmp0];
[tmp0][clip1] overlay=shortest=1:x=1148:y=0 [tmp1];
[tmp1][clip2] overlay=shortest=1:x=0:y=540 [tmp2];
[aud0][aud1][aud2]amix=inputs=3[a]
" -map "[tmp2]" -map "[a]" -c:v libx264 output.mkv"
Isso está funcionando lindamente.
Agora, para a questão (esperançosamente final). Todos apertaram o botão "gravar" em momentos diferentes, então os vídeos precisam ser deslocados no tempo antes de serem combinados.
Tentei adicionar -itsoffet conforme mencionado aqui , mas é claro que compensa o vídeo e não o áudio. Tentei adicionar o deslocamento após o STARTPTS conforme mencionado aqui e, novamente, compensa apenas o vídeo. Tentei compensar o áudio usando o método asetpts conforme mencionado aqui, mas isso não pareceu fazer nada.
EDITAR
[0:v] setpts=PTS-STARTPTS-0.2/TB,scale=960x540 [clip0];
[0:a]volume=1.7066118239302597,asetpts=PTS-STARTPTS-0.2/TB[aud0];
[1:v] setpts=PTS-STARTPTS-3.2/TB,crop=1080:1000:0:920,scale=583x540 [clip1];
[1:a]volume=2.384951956074125,asetpts=PTS-STARTPTS-3.2/TB[aud1];
[2:v] setpts=PTS-STARTPTS,scale=960x540 [clip2];
[2:a]volume=1.1[aud2];
Como avanço ou retrocedo os vídeos no tempo, mantendo o áudio sincronizado?
Eu tentei ir na outra direção (adicionando um offset positivo para os vídeos que começaram mais tarde, ao invés de um offset negativo para os vídeos que começaram mais cedo), só para ver o que aconteceria (veja se PTS-STARTPTS não gosta de números negativos) , e não foi melhor -
[0:v] setpts=PTS-STARTPTS+3/TB,scale=960x540 [clip0];
[0:a]volume=1.7066118239302597,asetpts=PTS-STARTPTS+3/TB[aud0];
[1:v] setpts=PTS-STARTPTS,crop=1080:1000:0:920,scale=583x540 [clip1];
[1:a]volume=2.384951956074125[aud1];
[2:v] setpts=PTS-STARTPTS+3.2/TB,scale=960x540 [clip2];
[2:a]volume=1.1,asetpts=PTS-STARTPTS+3.2/TB[aud2];
[base][clip0] overlay=shortest=1:x=0:y=0 [tmp0];
[tmp0][clip1] overlay=shortest=1:x=1148:y=0 [tmp1];
[tmp1][clip2] overlay=shortest=1:x=0:y=540 [tmp2];
[aud0][aud1][aud2]amix=inputs=3[a]
EDIT: ffmpeg -version reports
ffmpeg version git-2020-08-07-fab00b0 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.2.1 (GCC) 20200805
que parece razoavelmente atual.
itsoffset
funciona em áudio também; é só que o amix não respeita timestamps absolutos. Use aresample para preencher o início com silêncio.Também sugiro que você altere os deslocamentos em relação ao vídeo inicial mais antigo, para que todos os deslocamentos sejam positivos.
overlay
deve ser alterado para evitar a exibição de um primeiro quadro congelado até o início da reprodução, para fluxos atrasados.Use ffmpeg 4.1 ou posterior.