FFMPEG: audio stream normalizálása

Az ffmpeg tartalmaz egy loudnorm nevű filtert, amely kiegyensúlyozza a hangerőt az EBU R128 szabvány szerint. Egy másik lehetőség a dynaudnorm (Dynamic Audio Normalizer), amely valós időben végzi a hangerőkiegyenlítést.

Az alábbi parancs egy Icecast streamet fogad forrásként, normalizálja a hangerőt, majd továbbítja egy másik Icecast szerverre:

ffmpeg -i http://forras-stream-url/orosfm.mp3 \
-filter_complex "dynaudnorm=f=150:g=5" \
-c:a libmp3lame -b:a 128k -content_type audio/mpeg \
-f mp3 icecast://user:password@cel-szerver:8000/stream.mp3

Magyarázat a parancshoz

  • -i http://forras-stream-url/orosfm.mp3 → Forrásstream megadása.
  • -filter_complex "dynaudnorm=f=150:g=5"Dynamic Audio Normalizer:
    • f=150: Frekvenciatartomány (minél magasabb, annál simább).
    • g=5: Maximális hangerő növekedés (dB-ben).
  • -c:a libmp3lame -b:a 128k → MP3 kódolás, 128 kbps bitráta.
  • -content_type audio/mpeg → Megfelelő MIME-típus beállítása Icecast számára.
  • -f mp3 → MP3 formátum beállítása.
  • icecast://user:password@cel-szerver:8000/stream.mp3 → Cél Icecast szerver címe, felhasználónévvel és jelszóval.

Alternatíva: loudnorm használata (precízebb, de késleltethet)

Ha pontosabb normalizálást akarsz az EBU R128 szabvány szerint, használhatod a loudnorm filtert:

ffmpeg -i http://forras-stream-url/orosfm.mp3 \ -filter_complex "loudnorm=I=-16:TP=-1:LRA=11" \ -c:a libmp3lame -b:a 128k -content_type audio/mpeg \ -f mp3 icecast://user:password@cel-szerver:8000/stream.mp3

Paraméterek magyarázata:

I=-16 → Integrated loudness (integrált hangerő) -16 LUFS

Ez az átlagos hangerősség a teljes audio időtartama alatt.

Ajánlott értékek:

  • Streaming (Spotify, YouTube, Apple Music, stb.): általában -14 vagy -16 LUFS.
  • TV és rádióadások (EBU R128 szabvány): általában -23 LUFS.

TP=-1 → True Peak (csúcshangerő) -1 dBFS

A digitális hangban a maximális csúcshangszint (Peak Level) korlátozása.

Ajánlott értékek:

  • CD-mastering: -0.3 dBFS
  • Streaming szolgáltatások: -1 dBFS (biztonsági tartaléknak)

LRA=11 → Loudness Range (hangerő dinamika tartomány) 11 LU

A halk és hangos részek közötti dinamikai különbség. Minél kisebb az érték, annál kiegyenlítettebb a hangerő.

Ajánlott értékek:

  • Podcastok, beszédhangok: 3-6 LU (kevés dinamika)
  • Film, zene, rádió: 8-15 LU (nagyobb dinamika)

Melyiket válaszd?

  • dynaudnorm: Javasolt valós idejű stream esetén, mert gyors és dinamikusan alkalmazkodik.
  • loudnorm: Ha pontosabb és szabványosított normalizálást szeretnél, de kicsit késleltethet.

A measure és apply módok használata

Ha további finomhangolásra van szükséged, akkor az FFmpeg ezt a szűrőt képes kétlépcsős normalizálásra is használni (measure és apply módokkal).

Az FFmpeg loudnorm szűrőjét kétlépcsős módban is használhatod, ami precízebb hangerő-normalizálást biztosít. Ez különösen hasznos lehet, ha az audioanyagok nagyon eltérő hangerőszintekkel rendelkeznek.

🔹 1. lépés: Elemzés (measure mód)

Elsőként lefuttatjuk az FFmpeg-et úgy, hogy csak analizálja a hangerőt, de nem módosítja az audiot.

ffmpeg -i input.mp3 -af loudnorm=I=-16:TP=-1:LRA=11:print_format=json -f null -

Mit csinál ez?

  • Nem módosítja az audiot, csak elemzi.
  • A parancs végén JSON formátumban kiírja a szükséges hangerőértékeket, például:
{
"input_i": "-20.3",
"input_tp": "-2.5",
"input_lra": "6.2",
"input_thresh": "-30.0",
"output_i": "-16.0",
"output_tp": "-1.0",
"output_lra": "11.0",
"output_thresh": "-26.0",
"target_offset": "0.0"
}

Ezek az értékek kellenek majd a következő lépésben. Jegyezd fel őket!

🔹 2. lépés: Alkalmazás (apply mód)

Most használjuk a kapott értékeket, hogy normalizáljuk az audiot.

ffmpeg -i input.mp3 -af loudnorm=I=-16:TP=-1:LRA=11:measured_I=-20.3:measured_TP=-2.5:measured_LRA=6.2:measured_thresh=-30.0:offset=0.0 -c:a libmp3lame -b:a 192k output.mp3

Mit csinál ez?

  • Az elemzett értékeket használja fel a hangerő precíz beállításához.
  • Megőrzi a dinamikát, de minden egyes részlet a kívánt -16 LUFS hangerőszinten lesz.
  • Megakadályozza a torzítást, mivel a csúcshangerő (-1 dBFS) limitálva van.

Összegzés

  1. Elemzés (measure) → Megkapod a hangerőadatokat.
  2. Alkalmazás (apply) → A kapott adatokkal normalizálod az audiot.

Ez a kétlépcsős megoldás sokkal pontosabb, mint az egyetlen loudnorm futtatása, mert az FFmpeg így nem csak találomra állítja be a hangerőt, hanem konkrét mérési adatok alapján dolgozik.

Tipp: Ha Icecast streamre alkalmaznád ezt, akkor a második lépésben output.mp3 helyett közvetlenül streamelheted az eredményt:

ffmpeg -i http://forras-stream-url/orosfm.mp3 -af loudnorm=I=-16:TP=-1:LRA=11:measured_I=-20.3:measured_TP=-2.5:measured_LRA=6.2:measured_thresh=-30.0:offset=0.0 -c:a libmp3lame -b:a 128k -f mp3 icecast://user:password@cel-szerver:8000/stream.mp3