Skip to main content

ffmpeg-normalize

ffmpeg-normalize logo

PyPI version Docker Image Version GitHub Actions Workflow Status

All Contributors

A utility for batch-normalizing audio using ffmpeg.

This program normalizes media files to a certain loudness level using the EBU R128 loudness normalization procedure. It can also perform RMS-based normalization (where the mean is lifted or attenuated), or peak normalization to a certain target level.

✨ Features

  • EBU R128 loudness normalization — Two-pass by default, with an option for one-pass dynamic normalization
  • RMS-based normalization — Adjust audio to a specific RMS level
  • Peak normalization — Adjust audio to a specific peak level
  • Selective audio stream normalization — Normalize specific audio streams or only default streams
  • Skip files already at target — Avoid re-encoding files already within a threshold of the target level
  • Self-documenting output — Optionally record the effective encoder settings as an ENCODER_SETTINGS tag
  • Video file support — Process video files while preserving video streams
  • Docker support — Run via Docker container
  • Python API — Use programmatically in your Python projects
  • Shell completions — Available for bash, zsh, and fish
  • Album Batch normalization – Process files jointly, preserving relative loudness

🚀 Quick Start

  1. Install a recent version of ffmpeg and Python 3.10 or higher
  2. Run pip3 install ffmpeg-normalize and ffmpeg-normalize /path/to/your/file.mp4, alternatively install uv and run uvx ffmpeg-normalize /path/to/your/file.mp4
  3. Done! 🎧 (the normalized file will be called normalized/file.mkv)

🆕 What's New

  • Version 1.42.0 can optionally write an ENCODER_SETTINGS tag on each normalized audio stream via --write-encoder-settings. The tag holds an ffmpeg-command-equivalent string — the audio codec, bitrate, sample rate and channels, plus the normalization filter including the measured loudnorm values — so a normalized file documents how it was produced. This is a Matroska/WebM convention and has no effect with --metadata-disable.

    Example:

    ffmpeg-normalize input.wav -c:a libopus -b:a 128k --write-encoder-settings -o output.mkv
    
  • Version 1.41.0 automatically picks the correct output audio codec for the output container, so you no longer need to specify -c:a/--audio-codec unless you want to override the default. PCM is chosen for containers that support it; others will use teh default that ffmpeg picks. See the usage guide for details.

  • Version 1.40.0 can optionally skip files that are already at the target level via --threshold (e.g. --threshold 0.5, disabled by default). Such files are copied through unchanged instead of being re-encoded. The --print-stats output now includes a per-file status (normalized, skipped, or error, plus an error message on failure), and the exit code is non-zero if any file failed to process, so a script can tell what happened to each file.

    Example:

    ffmpeg-normalize input.flac -nt peak -t 0 -c:a flac --print-stats -o output.flac
    
  • Version 1.39.0 preserves the input bit depth by default when encoding to formats like FLAC, so 16-bit input stays 16-bit without needing -e "-sample_fmt s16". Use --no-keep-bit-depth to opt out. It also adds --keep-mtime to copy the input file's modification time to the output, which is useful for preserving when a track was added to a music library.

    Example:

    ffmpeg-normalize input.flac -nt peak -t 0 -c:a flac --keep-mtime -o output.flac
    
  • Version 1.38.0 writes the normalized output directly to the destination without using temporary files

  • Version 1.36.0 introduces presets with --preset! Save and reuse your favorite normalization configurations for different use cases. Comes with three built-in presets: podcast (AES standard), music (RMS-based batch normalization), and streaming-video (video content). Create custom presets too!

    Example:

    ffmpeg-normalize input.mp3 --preset podcast
    

    applies the podcast preset (EBU R128, -16 LUFS) to your file. Learn more in the presets guide.

  • Version 1.35.0 has batch/album normalization with --batch. It preserves relative loudness between files! Perfect for music albums where you want to shift all tracks by the same amount.

    Example:

    ffmpeg-normalize album/*.flac --batch -nt rms -t -20
    

    shifts the entire album so the average RMS is -20 dB, preserving the original relative loudness as mastered.

  • Version 1.34.0 brings selective audio stream normalization! You can now:

    • Normalize specific audio streams with -as/--audio-streams (e.g., -as 1,2 to normalize only streams 1 and 2)

    • Normalize only default audio streams with --audio-default-only (useful for files with multiple language tracks)

    • Keep other streams unchanged with --keep-other-audio (copy non-selected streams without normalization)

      Example:

      ffmpeg-normalize input.mkv -as 1 --keep-other-audio
      

      normalizes stream 1 and copies all other audio streams unchanged.

Other recent additions:

  • Shell completions (v1.31.0) — Tab completion for bash, zsh, and fish shells. See the installation guide for setup instructions.
  • --lower-only option — Prevent audio from increasing in loudness, only lower it if needed (works with all normalization types).

See the full changelog for all updates.

📓 Documentation

Check out our documentation for more info!

🤝 Contributors

The only reason this project exists in its current form is because @benjaoming's initial PRs. Thanks for everyone's support!

Benjamin Balder Bach
Benjamin Balder Bach

💻
Eleni Lixourioti
Eleni Lixourioti

💻
thenewguy
thenewguy

💻
Anthony Violo
Anthony Violo

💻
Eric Jacobs
Eric Jacobs

💻
kostalski
kostalski

💻
Justin Pearson
Justin Pearson

💻
ad90xa0-aa
ad90xa0-aa

💻
Mathijs
Mathijs

💻
Marc Püls
Marc Püls

💻
Michael V. Battista
Michael V. Battista

💻
WyattBlue
WyattBlue

💻
Jan-Frederik Schmidt
Jan-Frederik Schmidt

💻
mjhalwa
mjhalwa

💻
07416
07416

📖
sian1468
sian1468

⚠️
Panayiotis Savva
Panayiotis Savva

💻
HighMans
HighMans

💻
kanjieater
kanjieater

🤔
Ahmet Sait
Ahmet Sait

💻
georgev93
georgev93

💻
David Bern
David Bern

💻
randompersona1
randompersona1

💻
Petr
Petr

💻
Add your contributions

Metadata

Release files for ffmpeg-normalize 1.42.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ffmpeg-normalize 1.42.1
File Size Uploaded
ffmpeg_normalize-1.42.1.tar.gz 44.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ffmpeg-normalize 1.42.1
File Interpreter ABI Platform
ffmpeg_normalize-1.42.1-py3-none-any.whl Python 3 none any Details

Total release size: 95.3 kB

Release files / ffmpeg_normalize-1.42.1.tar.gz

Download URL ffmpeg_normalize-1.42.1.tar.gz
Size 44.5 kB
Tags Source
SHA-256 checksum
How to use checksums
87d68bad2285ef5e7acb291af995156fe7fd3b0e8a5a3e61be1429af7f522ee3
BLAKE2b-256 checksum
How to use checksums
551176bca2b0053dcf3633be0b6a755d33e7e30f033ddb2ee0fb8291a5aad9d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / ffmpeg_normalize-1.42.1-py3-none-any.whl

Download URL ffmpeg_normalize-1.42.1-py3-none-any.whl
Size 50.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fb18488e308c0e20bc95b4b5164e04d9c47726592e44ae3435ffcbaf7e854269
BLAKE2b-256 checksum
How to use checksums
83e261e8094cb5f34909512bec280fb5b6f9ffce688272b8a7490530f6f16b24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release history Release notifications | RSS feed

1.43.0

2 release files

This release

1.42.1 This release

2 release files

1.41.1

2 release files

1.41.0

2 release files

1.40.0

2 release files

1.39.0

2 release files

1.38.0

2 release files

1.37.8

2 release files

1.37.7

2 release files

1.37.6

2 release files

1.37.5

2 release files

1.37.4

2 release files

1.35.0

2 release files

1.34.0

2 release files

1.33.4

2 release files

1.33.3

2 release files

1.33.2

2 release files

1.33.0

1 release file

1.32.5

1 release file

1.32.4

1 release file

1.32.3

1 release file

1.31.3

2 release files

1.31.2

2 release files

1.31.1

2 release files

1.31.0

2 release files

1.30.0

2 release files

1.29.2

2 release files

1.29.1

2 release files

1.29.0

2 release files

1.28.3

2 release files

1.28.2

2 release files

1.28.1

2 release files

1.28.0

2 release files

1.27.7

2 release files

1.27.6

2 release files

1.27.5

2 release files

1.27.4

2 release files

1.27.1

2 release files

1.27.0

2 release files

1.26.6

2 release files

1.26.5

2 release files

1.26.1

2 release files

1.26.0

2 release files

1.25.2

2 release files

1.25.1

2 release files

1.25.0

2 release files

1.24.1

2 release files

1.23.1

2 release files

1.22.9

2 release files

1.22.7

2 release files

1.22.6

2 release files

1.22.5

2 release files

1.22.4

2 release files

1.22.3

2 release files

1.22.2

2 release files

1.22.1

2 release files

1.21.0

2 release files

1.20.1

2 release files

1.19.1

2 release files

1.18.2

2 release files

1.18.1

2 release files

1.18.0

2 release files

1.17.0

2 release files

1.15.8

2 release files

1.15.7

2 release files

1.15.5

2 release files

1.15.4

2 release files

1.15.3

2 release files

1.15.2

2 release files

1.15.1

2 release files

1.15.0

2 release files

1.14.1

1 release file

1.14.0

1 release file

1.13.11

1 release file

1.3.10

1 release file

1.3.8

1 release file

1.3.7

1 release file

1.3.5

1 release file

1.3.4

1 release file

1.3.3

1 release file

1.3.2

1 release file

1.3.1

1 release file

1.2.3

1 release file

1.2.2

1 release file

1.2.1

1 release file

1.2.0

1 release file

1.1.0

1 release file

1.0.10

1 release file

1.0.9

1 release file

1.0.8

1 release file

1.0.7

1 release file

1.0.6

1 release file

1.0.5

1 release file

1.0.4

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0

1 release file

0.7.3

1 release file

0.7.2

1 release file

0.7.1

1 release file

0.7.0

1 release file

0.6.0

1 release file

0.5.2

1 release file

0.5.1

1 release file

0.5

1 release file

0.4.3

1 release file

0.4.2

1 release file

0.4.1

1 release file

0.4.0

1 release file

0.2.5

1 release file

0.2.4

1 release file

0.2.3

1 release file

0.2.2

1 release file

0.2.1

1 release file

0.2.0

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page