Loudness Check on 15 AI Shorts: 3 Missed -14 LUFS, and loudnorm Didn't Always Land

Disclosure: this post has no affiliate links. The shop page linked at the end is our own product list and may contain affiliate links; we may earn a commission if you buy through those. All 15 videos measured here are short videos we made ourselves with AI tools, and this post was drafted with AI assistance, then checked against our measurement file from October 30, 2026 (KST). No tool vendor provided or reviewed it.

Short answer from one batch: we measured the audio of 15 finished vertical shorts from our own production folders against a target of -14 LUFS integrated loudness and a -1 dBTP true-peak ceiling. 12 of the 15 were already within 1 LU of the target. The three that were not had been quieter: -17.9, -16.1 and -39.3 LUFS. When we ran FFmpeg's loudnorm filter on all 15, the one-pass version missed the target by up to 3.4 LU, and even the measured two-pass version missed by up to 1.5 LU on four files. Every one of those four two-pass misses was a file where loudnorm reported it had switched from linear to dynamic mode.

The question

If you make short videos with AI voices, music and generated clips from different tools, the final files end up at different volumes. A common fix is one FFmpeg command: loudnorm. We wanted to know two things: how far off our own finished files actually were, and whether one pass of loudnorm, or the measured two-pass method, really lands every file on the number you ask for.

What we measured

  • 15 finished MP4 shorts made between October 4 and 27, 2026: product explainers, science explainers, a kids cartoon episode and AI character clips. Some were published, some were internal versions. Lengths 8.0 to 49.2 seconds; AAC audio, mostly 48 kHz mono.
  • Tool: FFmpeg 9.0.1. Loudness was read with the ebur128 filter with true-peak enabled: integrated loudness (LUFS), loudness range (LRA, in LU) and true peak (dBTP).
  • Target: -14 LUFS integrated, -1 dBTP true peak, LRA 11. We picked -14 LUFS as our own export target because it is a value commonly used for online video; we did not measure what any platform does to an upload.
  • One-pass: loudnorm=I=-14:TP=-1:LRA=11. Two-pass: first run loudnorm with print_format=json to get the measured values, then feed them back with linear=true.
  • Each normalized output was written as a WAV file and measured again with the same ebur128 filter. The whole batch ran in about 25 seconds on one laptop.

Results

FileLength (s)Before: LUFSBefore: LRABefore: dBTPOne-pass: LUFSTwo-pass: LUFSTwo-pass: dBTPMode loudnorm used
1. Test edit (audit sample)18.2-14.81.1-2.0-13.9-14.1-1.2linear
2. Sports explainer24.5-17.92.9-1.2-15.6-15.0-1.0dynamic
3. Product short (quiz)29.2-14.22.8-2.0-14.2-13.9-1.6linear
4. Product short (recipe)20.3-14.73.1-2.0-13.6-14.0-1.2linear
5. AI tool list short49.2-14.54.6-1.9-14.5-13.9-1.3linear
6. Product short (eSIM)31.5-14.01.4-2.4-14.2-13.9-2.3linear
7. AI character clip8.0-39.35.9-15.9-17.4-15.5-0.8dynamic
8. Kids cartoon episode15.0-14.34.3-1.5-14.4-14.0-1.0dynamic
9. Product short (shipping)23.7-15.02.6-1.8-13.9-13.9-0.8dynamic
10. AI character short17.1-13.317.80.0-15.0-12.8-1.0dynamic
11. Science short (fastball)24.5-14.21.8-2.4-14.0-13.9-2.1linear
12. Science short (deep sea)22.0-14.11.7-2.2-14.1-13.8-2.0linear
13. Science short (water)20.5-16.12.2-1.5-14.3-14.1-1.0dynamic
14. Science short (deep sea 2)21.5-14.12.6-1.5-14.0-13.9-1.3linear
15. AI character short 210.0-14.420.0-2.3-15.0-14.9-1.0dynamic

What stood out

  • Most files were already close. 12 of 15 were within 1 LU of -14 LUFS before any fix, and 8 were within 0.5 LU. The files that already came out of our normal edit step near the target did not need another pass.
  • The quiet ones were the problem. File 2 was 3.9 LU too quiet, file 13 was 2.1 LU too quiet, and file 7, an 8-second AI character clip, measured -39.3 LUFS, about 25 LU below the target.
  • One file touched 0.0 dBTP. File 10 had a true peak of 0.0 dBTP and a loudness range of 17.8 LU, much wider than the others (most were 1 to 5 LU).
  • One-pass loudnorm did not always land. 11 of 15 one-pass outputs were within 0.5 LU of -14. The worst was file 7 at -17.4 LUFS (3.4 LU short); files 2, 10 and 15 came out between -15.0 and -15.6.
  • Two-pass was closer, but not exact. 11 of 15 two-pass outputs were within 0.5 LU. The four that were not (files 2, 7, 10 and 15, off by 0.9 to 1.5 LU) were all runs where loudnorm reported dynamic instead of linear mode, even though we asked for linear. The FFmpeg documentation says linear mode falls back to dynamic when the source loudness range is above the target LRA, or when the gain needed would push the true peak past the ceiling. File 7 needed about 25 dB of gain, and files 10 and 15 had loudness ranges of 17.8 and 20.0 LU against our LRA target of 11. In total loudnorm used dynamic mode on 7 of 15 files.
  • The peak ceiling was exceeded twice. Two two-pass outputs (files 7 and 9) measured -0.8 dBTP, above the -1 dBTP we asked for.
  • Dynamic mode changed the dynamics. File 15 went from a loudness range of 20.0 LU to 8.7 LU after two-pass. That may be fine or not; we did not listen-test it.

What we decided

For our own pipeline: measure the final exported MP4, not an intermediate file. Use two-pass loudnorm, and after it runs, check whether it reports linear or dynamic. If it says dynamic, measure the output again instead of assuming it hit the target. For a file that is 25 LU too quiet, like file 7, fix the mix (the voice or the music level) before normalizing, rather than asking a filter to add that much gain.

Limits

  • 15 files from one team's workflow; most have a similar voice-plus-music mix. Other kinds of audio can behave differently.
  • We measured the normalized WAV outputs. We did not re-encode them back to AAC inside an MP4, which can move the true peak again. Our earlier true-peak post covers that step.
  • Numbers only: nobody listened to the files and rated them.
  • Platforms apply their own loudness handling after upload. We did not measure what YouTube, Instagram or TikTok played back.
  • One run per file on one laptop.

Try it yourself

Measure: ffmpeg -nostats -i final.mp4 -vn -af ebur128=peak=true -f null - and read the Summary block at the end. First pass: ffmpeg -i final.mp4 -vn -af loudnorm=I=-14:TP=-1:LRA=11:print_format=json -f null -. Second pass: put the printed input_i, input_tp, input_lra, input_thresh and target_offset into measured_I, measured_TP, measured_LRA, measured_thresh and offset, add linear=true:print_format=json, and check the normalization_type line in the output.

Sources checked

Related: our earlier test on CRF 18 vs 23 vs 28 for a vertical AI short.

Our product list: Label Picks shop page (may contain affiliate links).

Comments

Popular posts from this blog

FFmpeg Shows −1.5 dBTP. Did You Actually Fix the Audio?

VoxCPM2 vs ElevenLabs for a 30-Second Science Short: We Timed Both on the Same Script

Before You Upload an AI Song or Video: The Checks We Run (Free Commands)