ffmpeg - vidéo et audio désynchronisés
Cela semble être un problème courant, mais les réponses que j'ai trouvées ne semblent pas s'appliquer à ma situation.
Je fusionne 6 vidéos (l'une d'elles est un arrière-plan court qui boucle) en une vidéo de sortie, et l'audio et la vidéo sont un peu décalés (peut-être un quart de seconde). Voici ma ligne de commande:
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"
Je suppose que cela a à voir avec aresample et first_pts mais j'ai lu la documentation et je ne peux pas comprendre ce que je dois faire différemment.
Comment puis-je synchroniser mon audio et ma vidéo?
ÉDITER
Remarque: "Three.mp4" est l'accompagnement au piano; les autres morceaux sont des chanteurs individuels, ajoutant leurs voix au piano.
Réponses
Je suggère de créer un script afin que vous puissiez inclure les fichiers un par un. pour savoir quel fichier est défectueux.
Créez des fichiers dans un nouveau dossier, la structure est la suivante: test1.mov test1.ss test1.filterv test1.filtera etc.
test1.ss avec "0,2"
test1.filterv avec "crop = 1312: 1080: 290: 0, scale = 576x474"
test1.filtera avec "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
Ajoutez les fichiers un par un.
Je vous suggère d'utiliser un programme avec une interface graphique confortable.
Cela est dû au fait que vous ne semblez pas être complètement sûr du moment où votre sortie commence à être dissynchrone. Un programme avec une interface graphique, telle que Audacity , devrait vous aider à résoudre le problème efficacement.
Une note sur votre problème spécifique: avez-vous envisagé différents problèmes de pilote et d'encodage image par seconde? Vous pouvez rarement exclure le problème si c'est la cause, en essayant d'abord de les convertir chacun avec le même encodage audio / vidéo (y compris l'image par seconde), vérifiez la synchronisation et ensuite les fusionner ...