[Guida] Sincronizzare audio e video con ffmpeg

Installazione, configurazione e utilizzo di applicativi multimediali, masterizzazione, acquisizione e codec audio/video, streaming, ecc.

[Guida] Sincronizzare audio e video con ffmpeg

Messaggioda antoninomatrix » sabato 19 giugno 2010, 10:25

Capita a volte che (anche dopo una conversione con lo stesso ffmpeg) l'audio e il video in un filmato non siano sincronizzati, ossia l'uno è in ritardo o in anticipo rispetto all'altro. Ho escogitato un metodo - a dire il vero piuttosto artigianale - per rimediare, e senza conversione, quindi senza perdere qualità.

Anzitutto dividiamo il problema in due casi:

1) l'audio è in ritardo rispetto al video
2) l'audio è in anticipo rispetto al video


Primo caso (il più semplice)

Poniamo di avere questo problema all'interno del file film.avi; ecco come procedere:

1) calcoliamo a quanto ammonta il ritardo (personalmente utilizzo mplayer per fare questo, pigiando il tasto + durante la riproduzione finchè audio e video risultano allineati). Poniamo che sia di 0.6 secondi.

2) Da terminale entriamo nella directory che ospita film.avi col comando cd

3) isoliamo il video del filmato così:

Codice: Seleziona tutto
ffmpeg -i film.avi -an -vcodec copy video.avi


4) isoliamo e tagliamo l'audio del filmato così:

Codice: Seleziona tutto
ffmpeg -i film.avi -ss 0.6 -vn -acodec copy audio.mp3


NOTA: assicurati di dare la corretta estensione al file audio; di solito è .mp3 oppure .m4a (come ad esempio l'estensione dei video di youtube, che hanno codec aac). Per l'opzione -ss inserire il valore del ritardo - nel nostro caso 0.6.

5) ricongiungiamo audio e video:

Codice: Seleziona tutto
ffmpeg -i video.avi -i audio.mp3 -vcodec copy -acodec copy titolo_del_file.avi



Secondo caso

Poniamo di avere questo problema all'interno del file film.avi; ecco come procedere:

1) calcoliamo a quanto ammonta il ritardo (personalmente utilizzo mplayer per fare questo, pigiando il tasto - durante la riproduzione finchè audio e video risultano allineati). Poniamo che sia di 0.6 secondi.

2) Da terminale entriamo nella directory che ospita film.avi col comando cd

3) Qui le cose si comlplicano perchè, a differenza di un flusso audio, ffmpeg non è in grado di tagliare con buona precisione un flusso video. Tagliamolo dunque di un tempo x superiore a quello di desincronizzazione x>0.6. Per esempio tagliamolo di 1 secondo:

Codice: Seleziona tutto
ffmpeg -i film.avi -ss 1 -an -vcodec copy video.avi


Siccome, come già detto, il taglio non è preciso, con un lettore (mplayer o ffplay con l'opzione -stats) verifichiamo quanto tempo effettivamente è stato tagliato. Supponiamo che sia 1.4 secondi.

4) Isoliamo e tagliamo il file audio con l'opzione -ss pari alla differenza tra il tempo effettivamente sottratto al video col comando precedente e il tempo di desincronizzazione originale, e cioè: 1.4-0.6=0.8. Quindi:

Codice: Seleziona tutto
ffmpeg -i film.avi -ss 0.8 -vn -acodec copy audio.mp3


NOTA: assicurati di dare la corretta estensione al file audio; di solito è .mp3 oppure .m4a (come ad esempio l'estensione dei video di youtube, che hanno codec aac). Per l'opzione -ss inserire il valore della sottrazione - nel nostro caso 0.8.

In poche parole non abbiamo fatto altro che ricondurre il secondo caso al primo.

5) ricongiungiamo audio e video:

Codice: Seleziona tutto
ffmpeg -i video.avi -i audio.mp3 -vcodec copy -acodec copy titolo_del_file.avi




NOTA: non ho sperimentato il metodo con tutti i tipi di file, ma visto che ffmpeg ha talvolta difficoltà nella gestione di alcuni codec, è possibile che non sempre funzioni.
Ma coi file più comuni funziona nel 99% dei casi.

NOTA 2: se qualcosa non funziona potete provare a inserire l'opzione -ss dubito dopo il comando ffmpeg e subito prima dell'opzione -i. Ad esempio:

Codice: Seleziona tutto
ffmpeg -ss 1 -i film.avi -an -vcodec copy video.avi


BUON DIVERTIMENTO!
Avatar utente
antoninomatrix
Prode Principiante
 
Messaggi: 228
Iscrizione: febbraio 2007

Re: [Guida] Sincronizzare audio e video con ffmpeg

Messaggioda donstuart » giovedì 21 ottobre 2010, 15:10

Devo ringraziare l'autore di questa discussione... funziona davvero!  (good)

Solo due considerazioni:

- non ho capito cosa vuol dire utilizare l'opzione -stats con mplayer o ffplay, ho guardato la guida ma  di questa opzione non trovo traccia... così sono
  andato per tentativi ma sicuramente non ho capito bene io l'utilizzo, ti sarei moooolto grato se potessi essere più chiaro in merito (probabilmente
  sono io che ho la capa tosta ma che ce posso fa')?

- io ho fatto l'operazione utilizzando un file di tipo mpg con audio ac3, in prima battuta non mi era riuscita l'operazione ma poi ho capito che bastava installare,
  da ubuntu software center il "Plugin Gstreamer di Fluendo per il demuxing di MPEG2" e poi è andato tutto bene! (e ciò a beneficio di coloro i quali si siano
  già trovati di fronte il problema).

grazie ancora!
Avatar utente
donstuart
Prode Principiante
 
Messaggi: 193
Iscrizione: dicembre 2009
Località: Milano
Desktop: KDE/Gnome
Distribuzione: KUbuntu 13.04 x86_64 AMD X6

Re: [Guida] Sincronizzare audio e video con ffmpeg

Messaggioda antoninomatrix » lunedì 1 novembre 2010, 23:02

donstuart ha scritto:- non ho capito cosa vuol dire utilizare l'opzione -stats con mplayer o ffplay, ho guardato la guida ma  di questa opzione non trovo traccia... così sono
  andato per tentativi ma sicuramente non ho capito bene io l'utilizzo, ti sarei moooolto grato se potessi essere più chiaro in merito (probabilmente
  sono io che ho la capa tosta ma che ce posso fa')?


Ciao! L'opzione -stats si applica solo a ffplay - in effetti ho scritto in modo un po' confuso - che durante la riproduzione mostra diversi dettagli nella shell. Ad esempio:

Codice: Seleziona tutto
ffplay -stats video.avi
Avatar utente
antoninomatrix
Prode Principiante
 
Messaggi: 228
Iscrizione: febbraio 2007

Re: [Guida] Sincronizzare audio e video con ffmpeg

Messaggioda patel » domenica 8 gennaio 2012, 19:34

nel caso 2) l'audio è in anticipo rispetto al video non si può semplicemente utilizzare la procedura del caso 1 semplicemente cambiando il segno del valore inserito in
Codice: Seleziona tutto
ffmpeg -i film.avi -ss 0.6 -vn -acodec copy audio.mp3
e cioè

Codice: Seleziona tutto
ffmpeg -i film.avi -ss -0.6 -vn -acodec copy audio.mp3
?

mi rispondo da solo, ho provato e non funziona, nel mio caso ffmpeg ha tagliato il video senza errori, ho impostato 1 sec e così è stato
Ultima modifica di patel il lunedì 9 gennaio 2012, 10:17, modificato 1 volta in totale.
Un titolo ben azzeccato attira l'attenzione degli esperti in quel campo, fa risparmiare tempo a voi, aumenta la probabilità di successo.
patel
Accecante Asceta
Accecante Asceta
 
Messaggi: 23782
Iscrizione: aprile 2008
Località: Livorno


Torna a Multimediale

Chi c’è in linea

Visualizzano questa sezione: robyfofo e 3 ospiti