C.W.K.
Stream
Lesson 05 of 10 · published

Loudness Normalization (EBU R128)

~12 min · loudnorm, ebu, lufs, broadcast

Level 0Viewer
0 XP0/73 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

What broadcasters actually use

EBU R128 is a European Broadcast Union standard for loudness measurement. It defines three numbers:

  • Integrated loudness (LUFS) — average loudness over the whole file. Podcasts target -16 LUFS. YouTube normalizes to about -14 LUFS.
  • Loudness range (LRA) — dynamic range in LU. Lower = more compressed-sounding.
  • True peak (dBTP) — peak level accounting for inter-sample peaks. -1 dBTP is the safe ceiling.

FFmpeg's loudnorm filter

Two-pass operation: first pass measures, second pass applies. The two-pass form is much more accurate than single-pass because the filter knows the actual loudness profile before adjusting. For podcasts, the routine is: measure once, encode once with the measurements supplied to the filter.

Code

Two-pass loudnorm — the right way·bash
# PASS 1 — measure (parse JSON output)
ffmpeg -i in.wav -af \
  loudnorm=I=-16:TP=-1:LRA=11:print_format=json \
  -f null - 2> measurements.txt

# Look for the JSON block in measurements.txt:
# {
#   "input_i": "-21.42",
#   "input_tp": "-3.50",
#   "input_lra": "5.30",
#   "input_thresh": "-31.42",
#   "target_offset": "-0.10"
# }

# PASS 2 — apply the measurements
ffmpeg -i in.wav -af \
  "loudnorm=I=-16:TP=-1:LRA=11:measured_I=-21.42:measured_TP=-3.50:measured_LRA=5.30:measured_thresh=-31.42:offset=-0.10:linear=true" \
  -ar 48000 -c:a aac -b:a 192k normalized.m4a
Single-pass loudnorm — quick but less accurate·bash
# Quick podcast normalize (slight pumping artifacts vs two-pass)
ffmpeg -i in.wav -af "loudnorm=I=-16:TP=-1:LRA=11" \
  -ar 48000 -c:a aac -b:a 192k quick_norm.m4a

# Targets:
# Podcast streaming     -16 LUFS, -1 dBTP, LRA 11
# YouTube               -14 LUFS, -1 dBTP, LRA 7
# Audiobook (Audible)   -19 LUFS, -3 dBTP, LRA  ≤14

External links

Exercise

Pick a podcast WAV. Run pass 1 of loudnorm and note the JSON measurements. Run pass 2 with those values. Compare loudness using a meter (Audacity's analysis menu, or loudnorm a third time and compare integrated LUFS to your target). Do the same for a music track at -14 LUFS — does it sound natural or 'compressed'?

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.