Option 1: Built-in Normalization Filters
Current ffmpeg ha due filtri che possono essere usati direttamente per la normalizzazione - anche se sono già abbastanza avanzati, quindi non applicano semplicemente il guadagno per raggiungere un livello di picco. Eccoli qui:
-
loudnorm
: normalizzazione del volume secondo EBU R128. Puoi impostare un obiettivo di loudness integrato, un obiettivo di gamma di loudness o il massimo picco reale. Questo è raccomandato per la pubblicazione di audio e video ed è usato dai broadcaster di tutto il mondo.
-
dynaudnorm
: Normalizzazione “intelligente” del loudness senza clipping, che applica la normalizzazione dinamicamente su porzioni finestrate del file. Questo può cambiare le caratteristiche del suono, quindi dovrebbe essere applicato con cautela.
Inoltre, il filtro volume
può essere usato per eseguire semplici regolazioni del volume. Vedi la voce del wiki Audio Volume Manipulation per saperne di più.
Il filtro loudnorm
può essere usato con un solo passaggio, ma si raccomanda di eseguire due passaggi, che permettono una normalizzazione lineare più accurata. Questo è un po’ difficile da automatizzare. Inoltre, se vuoi una “semplice” normalizzazione basata sul RMS o sui picchi a 0 dBFS (o qualsiasi altro obiettivo), continua a leggere.
Opzione 2: Usa lo strumento ffmpeg-normalize
Ho creato un programma Python per normalizzare i file multimediali , disponibile anche su PyPi . Devi semplicemente:
Per esempio:
ffmpeg-normalize input.mp4 -o output.mp4 -c:a aac -b:a 192k
Oppure, per normalizzare semplicemente in batch un certo numero di file audio e scriverli come WAV non compressi in una cartella di output:
ffmpeg-normalize *.m4a -of /path/to/outputFolder -ext wav
Lo strumento supporta EBU R128 (default), RMS e peak. Dai un'occhiata a ffmpeg-normalize -h
per altre opzioni e controlla il README per alcuni esempi.
Inoltre, supporta la ricodifica con altri encoder (ad esempio, AAC o MP3), o la fusione automatica dell'audio nel video.
Opzione 3: Normalizzare manualmente l'audio con ffmpeg
In ffmpeg puoi usare il filtro volume
per cambiare il volume di una traccia. Assicurati di scaricare una versione recente del programma.
Questa guida è per la normalizzazione peak, il che significa che farà sedere la parte più forte del file a 0 dB invece che a qualcosa di più basso. C'è anche una normalizzazione basata su RMS che cerca di rendere il volume medio lo stesso in più file. Per farlo, non cercate di spingere il volume massimo a 0 dB, ma il volume medio al livello di dB scelto (per esempio -26 dB).
Trova il guadagno da applicare
Prima devi analizzare il flusso audio per il volume massimo per vedere se la normalizzazione sarebbe anche utile:
ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null
Sostituisci /dev/null
con NUL
su Windows.
Gli argomenti -vn
, -sn
, e -dn
indicano a ffmpeg di ignorare i flussi non-audio durante questa analisi. Questo accelera drasticamente l'analisi.
Questo produrrà qualcosa come il seguente:
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] mean_volume: -16.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] max_volume: -5.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] histogram_0db: 87861
Come puoi vedere, il nostro volume massimo è -5.0 dB, quindi possiamo applicare un guadagno di 5 dB. Se ottieni un valore di 0 dB, allora non hai bisogno di normalizzare l'audio.
Applica il filtro volume:
Ora applichiamo il filtro volume
a un file audio. Nota che applicare il filtro significa che dovremo ricodificare il flusso audio. Quale codec vuoi per l'audio dipende dal formato originale, ovviamente. Ecco alcuni esempi:
File audio semplice: Codifica semplicemente il file con qualsiasi codificatore tu abbia bisogno:
Formato AVI: Di solito c'è l'audio MP3 con il video che arriva in un contenitore AVI:
Formato MP4: Con un contenitore MP4, di solito troverai l'audio AAC. Possiamo usare l'encoder AAC integrato di ffmpeg.
Negli esempi precedenti, il flusso video sarà copiato usando -c:v copy
. Se ci sono sottotitoli nel tuo file di input, o più flussi video, usa l'opzione -map 0
prima del nome del file di output.