ffmpeg - video e audio non sincronizzati

Oct 26 2020

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

1 БаярГончикжапов Oct 27 2020 at 22:07

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.

Hastur Nov 05 2020 at 03:07

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 ...