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-use implements 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.py with measure_loudness() at line 397 and the skip flag defined at line 602.
  • Use --skip-loudness-normalization to 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:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →