What Loudness Normalization Standards Does video-use Use? EBU‑R128 Defaults Explained
video-use automatically normalizes all processed audio to the EBU‑R128 standard with targets of ‑14 LUFS integrated loudness, ‑1 dBTP true‑peak ceiling, and approximately 11 LUFS loudness range.
The browser-use/video-use open‑source tool applies broadcast‑grade loudness normalization during its rendering pipeline, ensuring exported videos meet professional streaming and social‑platform requirements without manual audio mastering. This article examines the specific EBU‑R128 parameters hard‑coded into the tool and how to control them from the command line.
EBU‑R128 Target Values in video-use
According to the source code in helpers/render.py, video-use enforces the following three EBU‑R128 metrics on every rendered video:
| Metric | Target Value | Purpose |
|---|---|---|
| Integrated loudness | ‑14 LUFS | Overall perceived loudness of the entire program |
| True‑peak ceiling | ‑1 dBTP | Maximum instantaneous level to prevent inter‑sample clipping |
| Loudness Range (LRA) | ~11 LUFS | Dynamic range suited for social‑media consumption |
These values align with the EBU‑R128 specification (European Broadcasting Union Recommendation R128), the industry standard for loudness normalization in television and streaming. The ‑14 LUFS target specifically matches the "social‑ready" profile used by major platforms including YouTube, Spotify, and Apple Music for uploaded content.
Where the Defaults Are Defined
The rendering helper module helpers/render.py contains the implementation of video-use's loudness pipeline.
Loudness Measurement Function
The core measurement logic resides at line 397 of helpers/render.py in the measure_loudness() function. This function analyzes the source audio and returns integrated loudness, true‑peak level, and loudness range before any gain is applied.
from pathlib import Path
from helpers.render import measure_loudness
# Inspect source audio without rendering
info = measure_loudness(Path("input.mp4"))
print(info)
# Output example: {'integrated': '-13.9 LUFS', 'true_peak': '-0.9 dBTP', 'lra': '10.8 LUFS'}
CLI Flag for Disabling Normalization
At line 602, the tool defines the --skip-loudness-normalization argument for users who want to bypass automatic processing:
# Default behavior: normalization applied
video-use render input.mp4 -o output.mp4
# Console output: "loudness normalization → social-ready (-14 LUFS / -1 dBTP / LRA 11)"
# Disable normalization for already-mastered audio
video-use render input.mp4 -o output.mp4 --skip-loudness-normalization
Confirmation Output
When normalization succeeds, the tool prints confirmation at line 650, displaying the exact targets applied so users can verify compliance.
Comparing video-use Loudness to Platform Standards
Different streaming services specify slightly different loudness targets. Here's how video-use defaults compare:
- YouTube Music / Spotify / Apple Podcasts: ‑14 LUFS — matches video-use exactly
- Apple Music: ‑16 LUFS — slightly quieter than video-use default
- Amazon Music: ‑14 to ‑16 LUFS — overlaps video-use range
- Twitch: ‑14 LUFS — matches video-use exactly
The tool's ‑14 LUFS / ‑1 dBTP profile prioritizes compatibility with the widest range of social and streaming platforms, accepting a small trade‑off with Apple's slightly stricter requirement.
Practical Command‑Line Examples
Standard Social‑Ready Render
video-use render project/raw.mov -o final/social.mp4
# Audio automatically normalized to EBU‑R128 social target
Preserve Original Audio Levels
video-use render project/mastered.mov -o final/archive.mp4 --skip-loudness-normalization
# Bypasses all loudness processing; use when audio is already broadcast‑compliant
Batch Processing with Loudness Verification
for f in sources/*.mov; do
video-use render "$f" -o "exports/$(basename "$f" .mov).mp4"
done 2>&1 | grep "loudness normalization"
# Filter logs to confirm normalization applied to each file
Summary
video-useimplements EBU‑R128 loudness normalization as a non‑optional default in its rendering pipeline.- Fixed targets: ‑14 LUFS integrated loudness, ‑1 dBTP true‑peak ceiling, ~11 LUFS loudness range.
- Core logic lives in
helpers/render.pywithmeasure_loudness()at line 397 and the skip flag defined at line 602. - Use
--skip-loudness-normalizationto disable processing for pre‑mastered audio tracks. - These defaults ensure cross‑platform compatibility without additional audio engineering.
Frequently Asked Questions
Does video-use support custom loudness targets like ‑16 LUFS or ‑23 LUFS?
No. According to the source code in helpers/render.py, the EBU‑R128 targets are hard‑coded constants. The tool offers only a binary choice: apply the default ‑14 LUFS profile or skip normalization entirely with --skip-loudness-normalization. Users requiring ‑23 LUFS (standard for broadcast television) or ‑16 LUFS (Apple Music) must process audio externally and then use the skip flag.
Why does video-use use ‑14 LUFS instead of ‑16 LUFS?
The ‑14 LUFS target prioritizes "social‑ready" content. This value aligns with YouTube, Spotify, and Twitch specifications, covering the majority of user workflows. The developers selected this compromise to maximize platform compatibility without exposing complexity. The ~11 LUFS loudness range additionally prevents over‑compression that would reduce engagement on mobile devices.
Is loudness normalization applied to all output formats equally?
Yes. The normalization pipeline runs before final encoding, so the same ‑14 LUFS / ‑1 dBTP corrections apply regardless of whether you output MP4, WebM, or MOV containers. The gain adjustment happens at the audio sample level, making it codec‑agnostic.
How can I verify that normalization actually occurred?
Two methods: (1) Check the console output for the confirmation string printed at line 650 of helpers/render.py, which reads loudness normalization → social-ready (-14 LUFS / -1 dBTP / LRA 11). (2) Analyze the rendered file with external loudness meters such as ffmpeg -af loudnorm=print_format=json -f null - or dedicated tools like ebur128 or Adobe Audition's loudness radar.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →