<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Loudnorm on Mozabre As Idle Moments</title><link>https://mitz17.com/en/tags/loudnorm/</link><description>Recent content in Loudnorm on Mozabre As Idle Moments</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Sun, 08 Mar 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://mitz17.com/en/tags/loudnorm/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Use ffmpeg loudnorm: LUFS Normalization and 2-Pass Settings Explained</title><link>https://mitz17.com/en/blog/ffmpeg-loudnorm-guide/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0900</pubDate><guid>https://mitz17.com/en/blog/ffmpeg-loudnorm-guide/</guid><description>&lt;h2 id="what-this-article-covers"&gt;What This Article Covers
&lt;/h2&gt;&lt;p&gt;This article explains how to normalize audio loudness with ffmpeg&amp;rsquo;s &lt;code&gt;loudnorm&lt;/code&gt; filter using LUFS-based targets.&lt;/p&gt;
&lt;p&gt;Instead of just pasting commands, it also covers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What &lt;code&gt;LUFS&lt;/code&gt; means&lt;/li&gt;
&lt;li&gt;The main &lt;code&gt;loudnorm&lt;/code&gt; parameters&lt;/li&gt;
&lt;li&gt;When to use &lt;code&gt;1-pass&lt;/code&gt; vs &lt;code&gt;2-pass&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Why re-encoding is required after normalization&lt;/li&gt;
&lt;li&gt;Basic settings that make MP3 metadata and artwork easier to preserve&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a Python-based implementation that batch-processes files through ffmpeg, see &lt;a class="link" href="../../../en/blog/mp3-normalizer-devlog/" &gt;Python MP3 Volume Normalizer with ffmpeg: How It Works and How to Use It&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="#prerequisites" &gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#what-is-lufs" &gt;What Is LUFS?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#start-here-basic-command-1-pass" &gt;Start Here: Basic Command (1-Pass)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#main-loudnorm-parameters" &gt;Main loudnorm Parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#when-to-use-1-pass-vs-2-pass" &gt;When to Use 1-Pass vs 2-Pass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#why-loudnorm-can-make-an-intro-sound-louder" &gt;Why loudnorm Can Make an Intro Sound Louder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#re-encoding-is-required-after-normalization" &gt;Re-Encoding Is Required After Normalization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#basic-settings-that-help-preserve-tags-and-artwork" &gt;Basic Settings That Help Preserve Tags and Artwork&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#how-to-think-about-filter-chains" &gt;How to Think About Filter Chains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#practical-templates" &gt;Practical Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#summary" &gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ffmpeg&lt;/code&gt; 6.x is available (installation reference: &lt;a class="link" href="https://qiita.com/Tadataka_Takahashi/items/9dcb0cf308db6f5dc31b" target="_blank" rel="noopener"
 &gt;this Qiita article&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The examples mainly target MP3, but the same ideas mostly apply to AAC, WAV, and FLAC&lt;/li&gt;
&lt;li&gt;The commands are written in a style that is easy to read in both PowerShell and bash&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-is-lufs"&gt;What Is LUFS?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;LUFS (Loudness Units relative to Full Scale)&lt;/code&gt; is a unit for perceived loudness based on ITU-R BS.1770. Values are usually negative, and numbers closer to zero mean louder audio.&lt;/p&gt;
&lt;p&gt;The reference for maximum digital sample amplitude is &lt;code&gt;0 dBFS&lt;/code&gt;, not &lt;code&gt;0 LUFS&lt;/code&gt;. LUFS is a separate metric for perceived loudness, which is why &lt;code&gt;TP&lt;/code&gt; (True Peak) limits are discussed in relation to &lt;code&gt;0 dBFS&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Typical practical targets used in distribution workflows are as follows. These are not universal hard standards for every platform, but common working references.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Platform&lt;/th&gt;
 &lt;th&gt;Practical LUFS Target&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;YouTube / Spotify&lt;/td&gt;
 &lt;td&gt;Around -14 LUFS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Podcast&lt;/td&gt;
 &lt;td&gt;Around -16 LUFS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;TV Broadcast (EBU R 128)&lt;/td&gt;
 &lt;td&gt;-23 LUFS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Note: Spotify applies playback loudness normalization, and the reference level can vary depending on the playback mode. YouTube also does not publish a simple official rule saying &amp;ldquo;always master to -14 LUFS.&amp;rdquo; Check the latest platform documentation when exact delivery requirements matter.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;figure&gt;&lt;img src="../../../blog/ffmpeg-loudnorm-guide/lufs-reference-en.png"
 alt="LUFS reference chart showing practical targets: YouTube and Spotify around -14 LUFS, podcast around -16 LUFS, and TV broadcast around -23 LUFS."&gt;
&lt;/figure&gt;

&lt;h2 id="start-here-basic-command-1-pass"&gt;Start Here: Basic Command (1-Pass)
&lt;/h2&gt;&lt;p&gt;Before going deeper, here is the quickest practical example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -map &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -map_metadata &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -c:v copy &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=-14:TP=-1.5:LRA=11&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c:a libmp3lame -q:a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is what each option does:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Option&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-i input.mp3&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Input file&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-map 0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Includes all input streams such as audio and artwork&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-map_metadata 0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Copies metadata such as ID3 tags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-c:v copy&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Copies album artwork without re-encoding it&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-af &amp;quot;loudnorm=...&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Applies the loudness normalization filter&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-c:a libmp3lame&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Re-encodes audio as MP3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-q:a 2&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;High-quality VBR setting&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you need tighter alignment to the target loudness, use &lt;code&gt;2-pass&lt;/code&gt;, covered below.&lt;/p&gt;
&lt;h2 id="main-loudnorm-parameters"&gt;Main loudnorm Parameters
&lt;/h2&gt;&lt;p&gt;The main parameter groups to understand are these:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Parameter&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;I&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Target LUFS (Integrated Loudness)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;TP&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;True Peak ceiling&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;LRA&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Target Loudness Range&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;linear&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Whether to use linear correction&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;measured_*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;First-pass measurements passed into &lt;code&gt;2-pass&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="i-target-lufs"&gt;&lt;code&gt;I&lt;/code&gt; (Target LUFS)
&lt;/h3&gt;&lt;p&gt;This is the main target that decides where the final loudness should land.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;I=-14&lt;/code&gt;: YouTube, Spotify&lt;/li&gt;
&lt;li&gt;&lt;code&gt;I=-16&lt;/code&gt;: Podcast&lt;/li&gt;
&lt;li&gt;&lt;code&gt;I=-23&lt;/code&gt;: TV and broadcast-style delivery&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tp-true-peak-ceiling"&gt;&lt;code&gt;TP&lt;/code&gt; (True Peak Ceiling)
&lt;/h3&gt;&lt;p&gt;This sets the effective peak ceiling including inter-sample peaks. Even when the waveform does not visually clip, playback or conversion can still create peaks above &lt;code&gt;0 dBFS&lt;/code&gt;, so leaving some headroom is standard practice.&lt;/p&gt;
&lt;p&gt;If you are unsure, starting around &lt;code&gt;-1.5 dBTP&lt;/code&gt; is a safe default.&lt;/p&gt;
&lt;h3 id="lra-loudness-range"&gt;&lt;code&gt;LRA&lt;/code&gt; (Loudness Range)
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;LRA&lt;/code&gt; represents the amount of loudness variation across a track. Higher values mean bigger differences between quiet and loud sections, which is more common in classical music or film audio.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Genre / Use&lt;/th&gt;
 &lt;th&gt;Typical LRA&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Pop / Rock&lt;/td&gt;
 &lt;td&gt;6-10&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;EDM / Dance&lt;/td&gt;
 &lt;td&gt;4-8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;General music&lt;/td&gt;
 &lt;td&gt;6-12&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Classical / Film audio&lt;/td&gt;
 &lt;td&gt;12-20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In practice, it is usually best to decide &lt;code&gt;I&lt;/code&gt; and &lt;code&gt;TP&lt;/code&gt; first, and only adjust &lt;code&gt;LRA&lt;/code&gt; when the material or delivery purpose clearly calls for it. If you are unsure, &lt;code&gt;LRA=11&lt;/code&gt; is a reasonable default.&lt;/p&gt;
&lt;h3 id="linear"&gt;&lt;code&gt;linear&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;linear=true&lt;/code&gt; tells &lt;code&gt;loudnorm&lt;/code&gt; to use linear gain correction when possible. In that mode, the whole track is shifted up or down more uniformly, while keeping the original dynamics relationship largely intact.&lt;/p&gt;
&lt;p&gt;This is commonly used in &lt;code&gt;2-pass&lt;/code&gt; processing. In &lt;code&gt;1-pass&lt;/code&gt;, linear correction is not always fully achievable.&lt;/p&gt;
&lt;h3 id="measured_"&gt;&lt;code&gt;measured_*&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;These parameters pass the first-pass measurements into the second pass.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;code&gt;measured_*&lt;/code&gt;&lt;/th&gt;
 &lt;th&gt;First-pass JSON field&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;measured_I&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input_i&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;measured_TP&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input_tp&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;measured_LRA&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input_lra&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;measured_thresh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input_thresh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;offset&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;target_offset&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="when-to-use-1-pass-vs-2-pass"&gt;When to Use 1-Pass vs 2-Pass
&lt;/h2&gt;&lt;h3 id="1-pass"&gt;1-Pass
&lt;/h3&gt;&lt;p&gt;This analyzes and normalizes in a single ffmpeg run. It is simple and fast, which makes it good for quick trials and batch processing.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=-14:TP=-1.5:LRA=11&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c:a libmp3lame -q:a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The tradeoff is that it tends to be less precise than &lt;code&gt;2-pass&lt;/code&gt; when you care about strict target matching.&lt;/p&gt;
&lt;h3 id="2-pass"&gt;2-Pass
&lt;/h3&gt;&lt;p&gt;This measures the file in the first pass, then uses the measured values in the second pass. It is more stable when you need the output to land closer to the intended target.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pass 1: measure only&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=-14:TP=-1.5:LRA=11:print_format=json&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -f null -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This does not produce an output file. Instead, it returns JSON containing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_i&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_tp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_lra&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_thresh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;target_offset&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pass 2: use the measured values&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -map &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -map_metadata &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -c:v copy &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=-14:TP=-1.5:LRA=11:linear=true:measured_I=-18.3:measured_TP=-0.7:measured_LRA=9.5:measured_thresh=-29.2:offset=-0.1&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c:a libmp3lame -q:a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you are building a tool around ffmpeg, it is usually easier to separate the measurement phase from the production conversion phase.&lt;/p&gt;
&lt;h2 id="why-loudnorm-can-make-an-intro-sound-louder"&gt;Why loudnorm Can Make an Intro Sound Louder
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;loudnorm&lt;/code&gt; decides the gain adjustment from the &lt;strong&gt;integrated loudness of the whole track&lt;/strong&gt;. It does not treat a quiet intro as a separate section.&lt;/p&gt;
&lt;p&gt;That means intros may end up sounding louder than expected in tracks like these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Songs with an extremely quiet intro and a much louder later section&lt;/li&gt;
&lt;li&gt;Material with naturally wide dynamics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is especially noticeable with &lt;code&gt;linear=true&lt;/code&gt;, because the whole track is shifted more uniformly. &lt;code&gt;TP&lt;/code&gt; only limits peak ceiling; it does not prevent the perceived loudness of a quiet intro from increasing.&lt;/p&gt;
&lt;p&gt;Useful mitigations include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefer &lt;code&gt;2-pass&lt;/code&gt; over &lt;code&gt;1-pass&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Lower the target LUFS slightly&lt;/li&gt;
&lt;li&gt;Combine normalization with pre-editing or other dynamics processing when the source needs it&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="re-encoding-is-required-after-normalization"&gt;Re-Encoding Is Required After Normalization
&lt;/h2&gt;&lt;p&gt;When you use an audio filter like &lt;code&gt;loudnorm&lt;/code&gt;, ffmpeg has to decode the audio, process it, and encode it again. That means audio stream copy (&lt;code&gt;-c:a copy&lt;/code&gt;) is not an option.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-c:a libmp3lame -q:a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Common choices:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Option&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-c:a libmp3lame&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Re-encode as MP3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-q:a 2&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;VBR quality setting; lower numbers mean higher quality&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-b:a 192k&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use when you want an explicit bitrate for CBR or ABR-style output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For a practical balance of quality and file size, &lt;code&gt;-q:a 2&lt;/code&gt; or &lt;code&gt;-q:a 3&lt;/code&gt; is a good place to start.&lt;/p&gt;
&lt;h2 id="basic-settings-that-help-preserve-tags-and-artwork"&gt;Basic Settings That Help Preserve Tags and Artwork
&lt;/h2&gt;&lt;p&gt;MP3 files can contain more than audio: they may also include metadata (ID3 tags) and embedded cover art. If you leave out the mapping options, it is easy to end up with a file that still plays but has missing artwork or tags.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-map &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -map_metadata &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -c:v copy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Option&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-map 0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Includes all streams from the input&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-map_metadata 0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Copies metadata from the input&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;-c:v copy&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Copies the image stream without re-encoding&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Embedded MP3 cover art is usually handled internally as an image stream. If your output only maps audio, that stream gets dropped.&lt;/p&gt;
&lt;p&gt;That said, some custom ID3 frames or embedded lyrics may still fail to survive depending on the input structure. If metadata preservation matters, verify the output with a dedicated tag tool such as &lt;code&gt;id3v2&lt;/code&gt; or &lt;code&gt;eyeD3&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="how-to-think-about-filter-chains"&gt;How to Think About Filter Chains
&lt;/h2&gt;&lt;p&gt;With &lt;code&gt;-af&lt;/code&gt;, you can chain multiple filters in order by separating them with commas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;afftdn,agate,loudnorm=I=-14:TP=-1.5:LRA=11&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c:a libmp3lame -q:a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Common filter roles:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Filter&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;loudnorm&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Loudness normalization&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;afftdn&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Noise reduction&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;agate&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Noise gate&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Noise reduction and gating can be too aggressive on some material. In most cases, it is safer to get &lt;code&gt;loudnorm&lt;/code&gt; working well first, then add preprocessing only if needed.&lt;/p&gt;
&lt;h2 id="practical-templates"&gt;Practical Templates
&lt;/h2&gt;&lt;h3 id="quick-start-1-pass"&gt;Quick Start: 1-Pass
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -map &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -map_metadata &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -c:v copy &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=-14:TP=-1.5:LRA=11&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c:a libmp3lame -q:a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="more-accurate-2-pass"&gt;More Accurate: 2-Pass
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pass 1&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -hide_banner -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=-14:TP=-1.5:LRA=11:print_format=json&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -f null -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pass 2&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i input.mp3 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -map &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -map_metadata &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -c:v copy &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -af &lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=-14:TP=-1.5:LRA=11:linear=true:measured_I=...:measured_TP=...:measured_LRA=...:measured_thresh=...:offset=...&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c:a libmp3lame -q:a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;...&lt;/code&gt; with the values returned from the first pass JSON.&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Point&lt;/th&gt;
 &lt;th&gt;Summary&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Choosing targets&lt;/td&gt;
 &lt;td&gt;Start by deciding &lt;code&gt;I&lt;/code&gt;, then use &lt;code&gt;TP=-1.5&lt;/code&gt; and &lt;code&gt;LRA=11&lt;/code&gt; as practical defaults&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;1-pass&lt;/code&gt; vs &lt;code&gt;2-pass&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use &lt;code&gt;1-pass&lt;/code&gt; for speed, &lt;code&gt;2-pass&lt;/code&gt; for better accuracy&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Re-encoding&lt;/td&gt;
 &lt;td&gt;With filters, &lt;code&gt;-c:a libmp3lame -q:a 2&lt;/code&gt; or similar encoding settings are required&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tag and artwork preservation&lt;/td&gt;
 &lt;td&gt;Use &lt;code&gt;-map 0 -map_metadata 0 -c:v copy&lt;/code&gt; as the basic preservation setup&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tool design&lt;/td&gt;
 &lt;td&gt;Separate measurement (&lt;code&gt;-f null -&lt;/code&gt;) and production conversion into two phases&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you want to automate this from Python or wrap it in a GUI/CLI workflow, see &lt;a class="link" href="../../../en/blog/mp3-normalizer-devlog/" &gt;Python MP3 Volume Normalizer with ffmpeg: How It Works and How to Use It&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="related-posts"&gt;Related Posts
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="../../../en/blog/mp3-normalizer-devlog/" &gt;Python MP3 Volume Normalizer with ffmpeg: How It Works and How to Use It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="../../../en/blog/dev-pc-build-ryzen7600-rtx4070s/" &gt;Ryzen 5 7600 and RTX 4070 Super PC Build: Parts, Price, and Why I Chose Them&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>