ffmpeg - vídeo e áudio fora de sincronia

Oct 26 2020

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

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

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.

Hastur Nov 05 2020 at 03:07

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