使用FFmpeg Loudnorm双通法批量归一化音频LUFS的技术咨询
使用FFmpeg Loudnorm双通法批量归一化音频LUFS的技术咨询
嘿,我最近折腾了用FFmpeg的loudnorm滤镜,通过双通法批量把文件夹里的音频统一调整到指定LUFS和真峰值参数的方法,刚好可以分享给大家。
需求说明
我要处理桌面Audios LUFS文件夹里的3个MP3音频:Music1.mp3、Music2.mp3、Music3.mp3,目标是让所有音频统一达到:
- 目标LUFS:-10.0
- 目标真峰值:-0.5
同时会创建一个临时文件夹Temp_normalizing_lufs,用来存放处理过程中的中间文件,避免和原文件混在一起。
完整批处理脚本
下面是实现这个需求的Windows批处理代码,每一步都加了注释方便理解:
@echo off setlocal enabledelayedexpansion :: 创建临时文件夹,用于存放处理后的音频文件 md "C:\Users\%username%\Desktop\Temp_normalizing_lufs" :: 切换到原音频所在的文件夹(桌面的Audios LUFS目录) pushd "%Userprofile%\Desktop\Audios LUFS" :: 遍历文件夹内所有未被处理过的MP3文件(排除带_LOUDNORM/_EBU后缀的文件,避免重复处理) FOR /F "delims=" %%a in ('where .:*.mp3 ^|findstr /vi "_LOUDNORM _EBU"') DO ( :: 获取不带后缀的文件名 SET "filename=%%~na" :: ---------------------- 第一通:分析音频,生成响度统计日志 ---------------------- ffmpeg -hide_banner -i "%%a" -af "[0:a]loudnorm=print_format=summary" -f null NUL 2> "!filename!.log" :: 从日志中提取loudnorm需要的关键参数:输入LUFS、输入真峰值、输入增益 for /f "tokens=2 delims=:" %%b in ('findstr "Input Integrated Loudness:" "!filename!.log"') do set "input_i=%%b" for /f "tokens=2 delims=:" %%b in ('findstr "Input True Peak:" "!filename!.log"') do set "input_tp=%%b" for /f "tokens=2 delims=:" %%b in ('findstr "Input Gain:" "!filename!.log"') do set "input_g=%%b" :: ---------------------- 第二通:用提取的参数精准归一化音频 ---------------------- ffmpeg -hide_banner -i "%%a" -af "loudnorm=I=-10.0:TP=-0.5:LRA=11:measured_I=!input_i!:measured_TP=!input_tp!:measured_LRA=11:measured_thresh=-16.0:offset=!input_g!:print_format=summary" -c:v copy "C:\Users\%username%\Desktop\Temp_normalizing_lufs\!filename!_LOUDNORM.mp3" :: 删除临时生成的日志文件 del "!filename!.log" ) :: 切回初始目录 popd echo 批量归一化处理完成!处理后的文件存放在桌面的Temp_normalizing_lufs文件夹中。 pause
关键细节说明
- 双通法的优势:比起单通法,双通法会先分析每个音频的原始响度数据,再针对性调整,能更精准地达到目标参数,避免单通可能出现的响度偏差。
- 重复处理防护:脚本用
findstr /vi "_LOUDNORM _EBU"过滤已处理文件,防止重复执行。 - 核心参数解释:
I=-10.0:目标集成响度(LUFS)TP=-0.5:目标真峰值- 带
measured_前缀的参数:第一通分析得到的原始音频数据,用于第二通的精准校准
备注:内容来源于stack exchange,提问作者Clamarc
相关产品推荐
相关产品推荐

