ffmpeg loudnorm Fails or Reports Wrong LUFS on Stereo Fest Trailer - How to Fix
Problem: ffmpeg -af loudnorm on your fest trailer prints Incomplete stream, -inf LUFS, or integrated loudness that does not match Youlean on the same file. Your MP4 is clearly stereo in headphones, but ffprobe reports mono or a missing channel_layout.
Who is affected now: Indies batch-normalizing May–June 2026 store trailers after the fourteen-tool LUFS listicle traffic spike—Tool 3 ffmpeg loudnorm in CI or a shell script, without checking container metadata first.
Fastest safe fix: ffprobe -show_streams on the source → if layout is wrong, remux to stereo PCM with -ac 2 and aresample → run two-pass loudnorm with print_format=json → re-measure in Youlean → log loudness_receipt_v1.json with integrated LUFS in −14 ±1 band (or your signed target).
Direct answer
loudnorm implements ITU-R BS.1770 on the decoded channel set ffmpeg believes you have. When an AAC or MP4 stream tags mono but carries dual-mono stereo content, or when peaks clip before measurement, the filter sees the wrong layout and returns garbage. Fix the layout and headroom, then normalize—not the other way around.
Why this issue spikes in May 2026
- Listicle-driven ffmpeg adoption — Teams copy one-line
loudnormwithoutffprobe. - Agency MP4 handoffs — Video editors export dual mono or 1.0 + stereo pair mux quirks.
- Gameplay capture → trailer — OBS/Unity exports with odd channel masks.
- CI gates — Scripts fail builds on parse errors teams cannot reproduce in GUI meters.
- October fest locks — Audio column on Wednesday smoke now expects receipt-backed LUFS.
Pair with 14 Free fest trailer LUFS tools (resource) and Wwise/FMOD fest LUFS refresh for middleware + meter cross-links.
Symptoms and search phrases
ffmpegstderr:loudnormIncomplete stream or Value inf for parameter.- Printed
Input Integrated: -infon a file that sounds normal. - Youlean shows −15 LUFS; ffmpeg summary shows −22 or +3.
ffprobereportschannels=1/channel_layout=monoon stereo headphones mix.- Two identical-looking MP4s—one passes CI, one fails (different mux history).
- True peak above 0 dBTP before
loudnorm→ wild gain reduction.
Root causes (check in order)
- Wrong
channel_layouttag — stereo content labeled mono. - Missing downmix — filter runs on mono downmix of wide mix incorrectly.
- Duplicate mono tracks muxed — player sums;
ffprobepicks track 0 only. - Clipped master — peaks over 0 dBFS before loudness measurement.
- One-pass loudnorm on high LRA — dialogue + explosion stinger skews single pass.
- Measuring MP4 audio without extract — video codec warnings abort filter graph.
- Floating WAV exported 32-bit with NaNs — rare but produces
-inf.
Beginner path (30 minutes)
- Install ffmpeg 6.x+ and Youlean Loudness Meter (free).
- Run Step 1
ffprobebelow—screenshotchannel_layout. - Run Step 2 stereo repair WAV export.
- Measure repaired WAV in Youlean only (skip loudnorm until layout is sane).
- If still off target, use Step 3 two-pass
loudnorm. - Copy numbers into receipt JSON—attach to trailer upload ticket.
Working dev path
- Add
scripts/audio_probe.shto CI that fails whenchannel_layout≠stereofor trailer assets. - Store pass 1
loudnormJSON underrelease-evidence/audio/ffmpeg-logs/. - Gate promotion on receipt
promotion_allowed: true. - Cross-check BUILD_RECEIPT
audio_integrated_lufscolumn.
Step 1 — Probe streams with ffprobe
ffprobe -v error -select_streams a:0 -show_entries stream=channels,channel_layout,codec_name -of default=nw=1 trailer.mp4
ffprobe output |
Meaning | Next action |
|---|---|---|
channels=2 channel_layout=stereo |
Layout OK | Skip to Step 3 if levels wrong |
channels=1 channel_layout=mono |
Tag or mix is mono | Step 2 force stereo |
channels=2 layout empty |
Mask missing | Step 2 + verify in Youlean |
Multiple Stream #0:… audio |
Dual audio tracks | Map -map 0:a:0 explicitly |
List all audio streams when mux is suspicious:
ffprobe -v error -show_streams -select_streams a trailer.mp4
Step 2 — Force stereo PCM before loudnorm
Extract and repair layout (safe default for fest stereo trailers):
ffmpeg -y -i trailer.mp4 -map 0:a:0 -vn -ac 2 -ar 48000 -sample_fmt s16 -af aresample=resampler=soxr trailer_stereo.wav
Rules:
-ac 2— explicit stereo channel count for the filter graph.aresample=soxr— stable resample when source rate is 44.1 kHz or odd.-map 0:a:0— first audio track only when editors left a silent track 0.
If source is true mono VO, do not fake stereo—target −23 LUFS mono policy instead and document in receipt notes.
Step 3 — Two-pass loudnorm (measure then apply)
Pass 1 — measure (prints JSON stats):
ffmpeg -y -i trailer_stereo.wav -af loudnorm=I=-14:TP=-1.5:LRA=11:print_format=json -f null - 2> loudnorm_pass1.json
Parse input_i, input_tp, input_lra, input_thresh from the JSON blob at the bottom of stderr (ffmpeg writes stats to stderr).
Pass 2 — apply using measured values (replace placeholders):
ffmpeg -y -i trailer_stereo.wav -af loudnorm=I=-14:TP=-1.5:LRA=11:measured_I=INPUT_I:measured_TP=INPUT_TP:measured_LRA=INPUT_LRA:measured_thresh=INPUT_THRESH:linear=true:print_format=summary trailer_normalized.wav
Target band: −14 LUFS integrated ±1 for many 2026 fest stereo trailers (document if you choose −16 per listicle targets).
One-pass shortcut (only when LRA is tame):
ffmpeg -y -i trailer_stereo.wav -af loudnorm=I=-14:TP=-1.5:LRA=11:print_format=summary -f null -
Step 4 — Verify against Youlean
- Open
trailer_normalized.wavin Youlean. - Confirm integrated loudness within your signed band.
- Confirm true peak ≤ −1.0 dBTP (stricter than −1.5 if laptop clip is reported).
- If ffmpeg and Youlean still disagree by >1.5 LU, re-run Step 2—layout is still wrong.
loudness_receipt_v1.json
{
"schema": "loudness_receipt_v1",
"build_label": "trailer-nextfest-2026-05-rc2",
"assets": [
{
"file": "store/trailer_main_v3_normalized.wav",
"tool": "ffmpeg loudnorm two-pass",
"source_probe": "channels=1 mono → repaired stereo",
"integrated_lufs": -14.2,
"true_peak_dbtp": -1.1,
"pass": true
}
],
"promotion_allowed": true,
"ffmpeg_log": "release-evidence/audio/ffmpeg-logs/trailer-v3-loudnorm.json"
}
Proof table (working dev)
| Check | Command / tool | Pass criterion |
|---|---|---|
| Layout | ffprobe |
stereo or documented mono policy |
| Headroom | Youlean true peak | ≤ −1.0 dBTP before norm |
| Integrated | Youlean + ffmpeg summary | Within −14 ±1 LUFS (or signed target) |
| Receipt | loudness_receipt_v1.json |
promotion_allowed: true |
| Store truth | Trailer frame audit | Audio matches uploaded MP4 |
Prevention
- Add
channel_layout_checkto trailer export template in Resolve/Audacity—export stereo WAV for mastering, MP4 last. - Put
audio_layoutcolumn on Wednesday smoke BUILD_RECEIPT row. - Never run
loudnormon agency MP4 without extract—use VLC + ffmpeg extract workflow Tool 9. - Limit true peak in DAW before CLI normalization.
- When batching many trailers, fail CI on
ffprobenot on parseable English stderr strings only.
Troubleshooting
| Symptom | Fix |
|---|---|
Still -inf after -ac 2 |
Source may be silent—check ffmpeg -i duration and audible waveform |
| Left/right identical mono | Re-export true stereo from DAW; do not duplicate one channel |
| Pass 2 worse than pass 1 | Copy pass 1 JSON fields exactly; watch linear=true |
| MP4 fast, WAV fails | Extract audio first; avoid copying video codec into audio-only graph |
| Youlean OK, ffmpeg fails | Measure WAV only; do not loudnorm directly on H.264 container |
| Louder after norm | Lower I= target; check for limiter double-stacking in DAW |
FAQ
Is −14 LUFS mandatory for Steam?
Steam does not publish a fixed LUFS law for all trailers—teams pick −16 to −14 and document it. This article uses −14 ±1 as a common 2026 fest stereo band; align with your listicle target table.
Should I use ebur128 instead of loudnorm?
ebur128 measures; loudnorm measures and normalizes. Use ebur128 for read-only CI; use two-pass loudnorm when you need rendered output.
Audacity vs ffmpeg disagree?
See upcoming Audacity vs Youlean integrated LUFS mismatch help—often export bit depth or stereo sum differences.
Mono VO trailer?
Do not force -ac 2; set I=-23 (dialogue-forward) and mark mono_policy: true in receipt.
Related links
- 14 Free Audio Loudness and LUFS Meter Tools (2026 listicle)
- 14 Free fest trailer LUFS tools (resource bookmark list)
- Wednesday Demo Build Smoke Ritual
- Steam Store Trailer Frame and Demo Scope Audit
- Fest Demos Should Cap Menu Frame Rate (opinion)
- ffmpeg loudnorm filter documentation
- ffmpeg ffprobe documentation
Probe layout before you normalize—loudnorm fixes level, not a mis-tagged mono stream pretending to be stereo.