ffmpeg - video e audio non sincronizzati
Questo sembra essere un problema comune, ma le risposte che ho trovato non sembrano essere applicabili alla mia situazione.
Sto unendo 6 video (uno di questi è un breve sfondo che si ripete) in 1 video in uscita, e l'audio e il video sono leggermente sfasati (forse un quarto di secondo). Ecco la mia riga di 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"
Immagino che abbia a che fare con aresample e first_pts ma ho letto la documentazione e non riesco a capire cosa devo fare diversamente.
Come posso sincronizzare l'audio e il video?
MODIFICARE
Nota: "Three.mp4" è l'accompagnamento di pianoforte; le altre tracce sono singoli cantanti, aggiungendo le loro voci al pianoforte.
Risposte
Suggerisco di creare uno script in modo da poter includere i file uno per uno. per scoprire quale file è difettoso.
Crea file in una nuova cartella, la struttura è successiva: test1.mov test1.ss test1.filterv test1.filtera ecc.
test1.ss con "0.2"
test1.filterv con "crop = 1312: 1080: 290: 0, scale = 576x474"
test1.filtera con "volume = 1.7"
eccetera...
#!/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
Aggiungi i file uno per uno.
Ti suggerisco di utilizzare un programma con una GUI accogliente.
Questo perché non sembri essere completamente sicuro quando il tuo output inizia a essere dissincrono. Un programma con un'interfaccia grafica, come audacity , dovrebbe aiutarti a risolvere il problema in modo efficace.
Una nota sul tuo problema specifico: hai considerato possibili diversi problemi di codifica di driver e frame per secondo? Raramente è possibile escludere il problema se questa è la causa, provando prima a convertirli ciascuno con la stessa codifica audio / video (incluso il frame al secondo), verificare la sincronizzazione e quindi unirli insieme ...