2 votes

ffmpeg - vidéo et audio désynchronisés

Il semble que ce soit 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'entre elles est un court fond qui tourne en boucle) en une seule vidéo de sortie, et l'audio et la vidéo sont légèrement décalés (peut-être d'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 les paramètres aresample et first_pts, mais j'ai lu la documentation et je n'arrive pas à trouver ce que je dois faire différemment.

Comment faire pour que mon audio et ma vidéo se synchronisent ?

EDIT

Note : "Three.mp4" est l'accompagnement au piano ; les autres pistes sont des chanteurs individuels, ajoutant leur voix au piano.

1voto

Je suggère de faire un script afin de pouvoir inclure les fichiers un par un. pour savoir quel fichier est défectueux.

Créer des fichiers dans le 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.

0voto

Hastur Points 17791

Je vous suggère d'utiliser un programme avec une interface graphique agréable.

En effet, vous ne semblez pas être totalement sûr du moment où votre sortie commence à être dissynchrone. Un programme avec une interface graphique, tel que audace devrait vous aider à résoudre le problème de manière efficace.

Une note sur votre problème spécifique : avez-vous envisagé la possibilité de problèmes liés à différents pilotes et à l'encodage de l'image par seconde ? Vous pouvez rarement éliminer 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érifier la synchronisation et ensuite les fusionner ensemble...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X