How to check ebu r128 loudness (lufs, lra, true peak) in your browser
- Step 1Drop the file you want to measure — Drop any audio (or a video — its audio stream is read). FFmpeg loads it in-browser. To measure without changing the file, just read the report and discard the download.
- Step 2Pick the target you're checking against — Choose the preset for the platform you're QC'ing for — Apple Podcasts (-16), Spotify/YouTube (-14), Amazon Music (-14/-2 TP), or EBU broadcast (-23). The measurement is the same; the preset sets what the correction (and the dynamic-mode comparison) targets.
- Step 3Run the analysis — Click run. Pass one measures integrated LUFS, LRA, true-peak and threshold (parsed from FFmpeg's JSON output); pass two produces a corrected file. Measurement takes seconds to tens of seconds.
- Step 4Read the four-stat report — The result panel shows Integrated (LUFS), Range (LU), True peak (dBTP, highlighted if above -1), and Threshold (LUFS). These are your file's SOURCE numbers — the QC reading.
- Step 5Note any Dynamic-mode flag — A yellow Dynamic mode banner means your source LRA was wider than the preset target — flag for QC: the file is more dynamic than the spec wants and a linear normalise won't hit the target exactly.
- Step 6Verify by re-measuring the output — To confirm a correction landed, drop the downloaded normalised file back in and re-run: its new SOURCE report should read close to the target LUFS with true-peak under the ceiling.
The four EBU R128 metrics in the report
Field names match the result panel; values come from FFmpeg loudnorm pass-1 JSON (input_i / input_lra / input_tp / input_thresh) parsed in lib/audio/audio-engine.ts.
| Report field | Means | Units | Good-delivery zone |
|---|---|---|---|
| Integrated | Overall perceived loudness (gated, whole file) | LUFS | Match your target: -14, -16, or -23 |
| Range | Loudness Range (LRA) — spread between quiet and loud | LU | ~7-11 LU; lower for broadcast |
| True peak | Inter-sample peak level | dBTP | <= -1 dBTP (UI flags red if above) |
| Threshold | Relative gating threshold loudnorm computed | LUFS | Informational; ~10 LU below integrated |
Target specs to check against
Pick the preset matching your deliverable; the report tells you whether the source already meets it. Filters from lib/audio/audio-engine.ts.
| Deliverable | Integrated spec | True-peak spec | Preset to select |
|---|---|---|---|
| Podcast (Apple) | -16 LUFS | -1 dBTP | Apple Podcasts (-16 LUFS) |
| Spotify / YouTube | -14 LUFS | -1 dBTP | Spotify / YouTube (-14 LUFS) |
| Amazon Music | -14 LUFS | -2 dBTP | Amazon Music (-14, -2 TP) |
| TV / radio broadcast | -23 LUFS | -1 dBTP | EBU R128 broadcast (-23 LUFS) |
Reading the result — pass or fix?
Quick QC decisions from the report against a -16 LUFS / -1 dBTP podcast spec.
| Report shows | Verdict | Action |
|---|---|---|
| -16.1 LUFS, -1.2 dBTP | Pass | Already on spec; ship it |
| -12.0 LUFS, -0.4 dBTP | Too loud + peaks hot | Re-run to normalise down to -16 |
| -22.0 LUFS, -8 dBTP | Too quiet | Re-run to boost to -16 |
| Any + Dynamic-mode flag | Too dynamic for linear | Level/compress first, then normalise |
Cookbook
QC readings from the report. All figures are SOURCE measurements (the file as it came in). Re-drop the corrected output to verify it landed.
Pass: file already meets the -16 podcast spec
A finished episode measured against the Apple Podcasts preset reads on-target with safe peaks — no correction needed, ship the original.
Preset: Apple Podcasts (-16 LUFS) Report: Integrated : -16.0 LUFS Range : 7.9 LU True peak : -1.3 dBTP (not highlighted) Threshold : -26.2 LUFS Verdict: on spec. Discard the download, ship the original.
Fail: true peak above -1 dBTP
Integrated loudness is fine but inter-sample peaks exceed -1 dBTP, which the UI highlights red. The same run's corrected output brings peaks back under the ceiling.
Report: Integrated : -16.2 LUFS True peak : -0.3 dBTP <-- highlighted (> -1) Fix: download the corrected file (this run already applied a -1 dBTP limiter) OR use the dedicated true-peak-limiter for peak-only control: /audio-tools/true-peak-limiter
Dynamic-mode flag = source too dynamic
The report plus a yellow Dynamic-mode banner means source LRA exceeded the target. A QC red flag for broadcast, where tight LRA matters.
Preset: EBU R128 broadcast (-23 LUFS, LRA 7) Report: Integrated : -21.0 LUFS Range : 14.8 LU <-- far above LRA 7 -> Dynamic mode banner shown Meaning: file is too dynamic for a clean linear -23. Reduce dynamics first: /audio-tools/audio-compressor
Measure first, decide second
Use the report as a pure meter: run once, read the numbers, then choose the right downstream tool instead of guessing.
Report: Integrated : -19.4 LUFS (4-ish dB under podcast spec) Range : 9.2 LU (fine for linear) True peak : -10 dBTP (lots of headroom) Decision: a clean linear normalise to -16 will work. Re-run with Apple Podcasts preset, then re-measure output.
Confirm a correction actually landed
After normalising, re-drop the output to verify. The new SOURCE report should read the target.
Pass 1 (original): Integrated -22.0 LUFS -> normalise to -16, download output Pass 2 (re-drop output): Integrated -16.0 LUFS, True peak -1.1 dBTP (not highlighted) Verified on spec.
Edge cases and what actually happens
Report shows the input, not the output
By designThe four stats are the source measurement from loudnorm pass one (input_i, input_lra, input_tp, input_thresh). They tell you what the file was before correction — exactly what you want for QC. To verify a corrected file, re-drop the downloaded output and read its new source report.
Dynamic-mode flag appears
QC flagA yellow Dynamic mode banner means your source loudness range exceeded the preset's target LRA, so FFmpeg used per-window dynamic correction instead of a single linear gain. As a measurement signal it tells you the file is too dynamic to hit the target with a clean linear normalise — reduce dynamics with the audio-compressor or speech-leveler first.
True peak highlighted red
Over ceilingThe True peak stat is highlighted when it exceeds -1 dBTP — your file's inter-sample peaks are above the safe ceiling and could clip on lossy encode. The same run's corrected output applies a -1 dBTP limit; for peak-only correction without loudness change use the true-peak-limiter.
Threshold value looks unfamiliar
InformationalThreshold is the relative gating threshold loudnorm computed (typically ~10 LU below the integrated loudness). EBU R128 gates out silence and very quiet passages so they don't drag the integrated reading down. It's informational — you don't need to act on it.
Measuring re-encodes the file
ExpectedBecause this is the two-pass normalizer, the run also produces a corrected, re-encoded output. If you only wanted the numbers, just read the report and discard the download — but be aware the offered file is normalised + re-encoded, not your original byte-for-byte.
Very short or silent clip returns odd numbers
EdgeEBU R128 integrated loudness is gated and needs enough signal to be meaningful; a sub-second or near-silent clip can read very low or unstable. For reliable integrated LUFS, measure a representative section of at least several seconds of actual program material.
Pass-1 JSON not parseable
ErrorIf FFmpeg's pass-1 doesn't return a parseable JSON block (corrupt or non-audio file), the run throws 'Loudness analysis (pass 1) did not return a parseable JSON block.' Confirm the input is a real, decodable audio/video file.
Want a spectrum or waveform too
Different toolThis tool measures loudness only. For a frequency-content view use the spectrum-analyzer; for a visual amplitude render use the waveform-generator. Those are analysis/image tools and don't change loudness.
File over the tier limit can't be measured
RejectedLimits are 50 MB / 30 min (Free), 200 MB / 120 min (Pro), 100 GB / unlimited (Pro + Media / Developer); loudness-normalizer needs Pro + Media. An oversized or over-length file is rejected before measurement — measure a segment (split with audio-splitter) or upgrade.
Frequently asked questions
How do I check the LUFS of a file for free?
Drop it onto this tool and read the report: it shows Integrated LUFS, Range (LU), True peak (dBTP) and Threshold (LUFS) measured by FFmpeg's EBU R128 loudnorm engine — the same standard the platforms use. It runs in your browser, so nothing is uploaded and you don't need a DAW plugin.
Are these the same numbers a broadcaster's meter would show?
Yes — the report uses FFmpeg loudnorm with EBU R128 gating, the reference implementation behind most loudness meters. Integrated LUFS, LRA and dBTP true-peak are computed the standard way, so they line up with professional meters like those in Auphonic, Audition or a hardware R128 unit.
Does the report show my file's loudness or the corrected loudness?
It shows the source (input) measurement — your file as it came in. That's what you want for QC. To check a corrected file, normalise it, download, then re-drop the output and read its new source report (it should read the target).
What's a good integrated LUFS to aim for?
It depends on the destination: -16 LUFS for podcasts (Apple), -14 LUFS for Spotify/YouTube, -23 LUFS for broadcast. Pick the matching preset and the report tells you whether your file already meets the spec or needs correcting.
What does the red True peak highlight mean?
The True peak stat turns red when it's above -1 dBTP — your inter-sample peaks exceed the safe ceiling and could clip on lossy encode. Bring them under -1 by downloading this run's corrected output, or use the dedicated true-peak-limiter.
Why did I get a Dynamic-mode warning when I only wanted to measure?
It means your source loudness range (LRA) is wider than the preset's target, so the correction pass used dynamic instead of linear gain. As a measurement signal it tells you the file is too dynamic to hit the target cleanly. Reduce dynamics first with the audio-compressor and re-measure.
Is my file uploaded to measure it?
No. Measurement runs entirely in your browser via FFmpeg 8.1 WebAssembly. The file is read into memory locally and analysed on your CPU — nothing is sent to a server, so you can QC confidential or unreleased material safely.
Can I measure without changing the file?
Yes — just read the report and discard the download. Be aware the file the tool offers is the corrected, re-encoded version (this is the two-pass normalizer), not your original byte-for-byte. If you want a pure non-destructive meter, ignore the download.
What is LRA and why does it matter?
LRA (Loudness Range, in LU) is the statistical spread between the quiet and loud parts of your file. Broadcast wants it tight (~7 LU); podcasts tolerate ~11 LU. If your LRA exceeds the target, normalisation goes dynamic — so LRA is a key QC number, not just the integrated LUFS.
What's the difference between dBTP and dBFS?
dBFS measures sample peaks; dBTP (true peak) estimates inter-sample peaks that appear after a DAC or lossy decoder reconstructs the waveform. dBTP is always >= dBFS and is what streaming codecs care about, which is why the report uses dBTP and the ceiling is -1 dBTP.
Can it measure a whole album or batch?
One file per run on this tool, with batch limits by tier (1 Free, 10 Pro, 100 Pro + Media). Measure each track against the same preset so you can compare integrated LUFS and LRA across the record before mastering decisions.
Does measuring also give me a spectrum or waveform?
No — this tool reports loudness metrics only. For frequency content use the spectrum-analyzer; for an amplitude image use the waveform-generator. Combine all three for a full QC picture.
Privacy first
Every JAD Audio tool runs entirely in your browser via FFmpeg (WebAssembly) and RNNoise. Your audio files never leave your device — verified by zero outbound network requests during processing.