ffmpeg - vídeo e áudio fora de sincronia
Este parece ser um problema comum, mas as respostas que encontrei não parecem se aplicar à minha situação.
Estou mesclando 6 vídeos (um deles é um fundo curto em loop) em 1 vídeo de saída, e o áudio e o vídeo estão um pouco desligados (talvez um quarto de segundo). Esta é minha linha de comando:
ffmpeg -y
-ss 0.2 -i "One.MOV"
-ss 3.2 -i "Two.MOV"
-i "Three.mp4"
-ss 1.9 -i "Four.mp4"
-ss 1.9 -i "Five.MOV"
-stream_loop 180 -i "Background.mp4"
-filter_complex "
nullsrc=size=1920x1080 [back];
[5:v] scale=1920x1080 [fred];
[back][fred] overlay=shortest=1:x=0:y=0 [base];
[0:v] crop=1312:1080:290:0,scale=576x474 [clip0];
[0:a]volume=1.7[aud0];
[1:v] crop=1080:1056:0:864,scale=497x486 [clip1];
[1:a]volume=4.8,aresample=async=1:first_pts=0[aud1];
[2:v] scale=576x324 [clip2];
[2:a]volume=2.0,aresample=async=1:first_pts=0[aud2];
[3:v] crop=673:720:322:0,scale=454x486 [clip3];
[3:a]volume=6.9,aresample=async=1:first_pts=0[aud3];
[4:v] crop=720:921:0:359,scale=380x486 [clip4];
[4:a]volume=4.9,aresample=async=1:first_pts=0[aud4];
[base][clip0] overlay=shortest=1:x=32:y=83 [tmp0];
[tmp0][clip1] overlay=shortest=1:x=711:y=27 [tmp1];
[tmp1][clip2] overlay=shortest=1:x=1312:y=158 [tmp2];
[tmp2][clip3] overlay=shortest=1:x=93:y=567 [tmp3];
[tmp3][clip4] overlay=shortest=1:x=770:y=567 [tmp4];
[aud0][aud1][aud2][aud3][aud4]amix=inputs=5[a]
" -map "[tmp4]" -map "[a]" -c:v libx264 "Output.mp4"
Acho que tem a ver com aresample e first_pts, mas tenho lido a documentação e não consigo descobrir o que preciso fazer de maneira diferente.
Como posso sincronizar meu áudio e vídeo?
EDITAR
Nota: "Three.mp4" é o acompanhamento de piano; as outras faixas são cantores individuais, adicionando suas vozes ao piano.
Respostas
Eu sugiro fazer um script para que você possa incluir os arquivos um por um. para descobrir qual arquivo está com defeito.
Crie arquivos em uma nova pasta, a estrutura é a próxima: test1.mov test1.ss test1.filterv test1.filtera etc.
test1.ss com "0.2"
test1.filterv com "crop = 1312: 1080: 290: 0, scale = 576x474"
test1.filtera com "volume = 1,7"
etc ...
#!/bin/bash
SUM="$(ls test*.mov test*.mp4 | wc -l)" echo inputs = $SUM
BOX=1
while [ "$((BOX*BOX))" -lt "$SUM" ]; do ((BOX=BOX+1)); done
echo boxsize = "${BOX}x${BOX}"
WID=640
HEI=360
POX=0
POY=0
INP=()
FCT=-1
FSC=""
FLV=""
FLA=""
AUD=""
BAK="bg"
IFS=$'\n' for f in $(ls test*.mov test*.mp4); do
echo $f SSI="${f%.*}.ss"
echo $SSI if [[ -f "$SSI" ]]; then
INP+=("-ss")
INP+=($(<"${SSI}"))
fi
INP+=("-i")
INP+=("$f") ((FCT+=1)) if [ "$POX" -ge "$BOX" ]; then POX=0 ((POY+=1)) fi ((x=POX*WID)) ((y=POY*HEI)) ((POX+=1)) SSI="${f%.*}.filterv"
echo $SSI if [[ -f "$SSI" ]]; then
FIL=($(<"${SSI}"))
else
FIL=""
fi
if [ "$FIL" != "" ]; then FSC+="[${FCT}:v:0]${FIL}" SC1="${FCT}sca"
FSC+="[${SC1}]; " else SC1="${FCT}:v:0"
fi
FLV+="[${BAK}][${SC1}]overlay=x=${x}:y=${y}"
if [ "$FCT" -eq 0 ]; then FLV+=":eof_action=endall" fi BAK="${FCT}v0"
FLV+="[${BAK}]; " SSI="${f%.*}.filtera"
echo $SSI if [[ -f "$SSI" ]]; then
FIL=$(<"${SSI}")","
else
FIL=""
fi
FLA+="[${FCT}:a:0]${FIL}aresample=async=1:first_pts=0[${FCT}a0]; " AUD+="[${FCT}a0]"
done
((FCT+=1))
((POX=BOX*WID))
((POY=POY*HEI+HEI))
ffmpeg "${INP[@]}" -filter_complex "color=size=${POX}x${POY}[bg]; ${FSC} ${FLV} ${FLA} ${AUD} amix=inputs=${FCT}[a]" -map "[${BAK}]" -map [a] -c:v h264_nvenc -cq 20 -c:a aac -q:a 4 -y output.mkv
Adicione arquivos um por um.
Eu sugiro que você use algum programa com uma GUI aconchegante.
Isso ocorre porque você não parece estar completamente certo de quando sua saída começa a ser dessíncrona. Um programa com interface gráfica, como o audacity , deve ajudá-lo a resolver o problema com eficácia.
Uma observação sobre seu problema específico: você considerou possíveis problemas de driver diferente e de codificação de quadro por segundo? Raramente você pode descartar o problema se esta for a causa, primeiro tentando convertê-los cada um com a mesma codificação de áudio / vídeo (incluindo o quadro por segundo), verifique a sincronização e depois mescle-os ...