用途:使用 ffmpeg 的两遍 loudnorm 滤镜(EBU R128)对视频或音频文件做响度标准化。多数社交平台目标约为 -14 LUFS 整体响度、-1 dB 真峰值上限、LRA 上限约 11。该技能用于替代各广告打磨脚本中临时拼凑的 alimiter 链。必须使用两遍而非单遍,因为第二遍会利用第一遍测得的统计量做线性归一化,避免动态失真。
主要能力:支持 mp4/mov/wav/mp3 输入;可指定目标整体 LUFS、真峰值 dBTP、响度范围上限;提供平台预设 social(-14/-1/11,默认)、broadcast(-23/-2/7)、podcast(-16/-1/11)。输出标准化文件,并生成 manifest.json 与 verification.md。
使用方式:参数包括 --input、--output(必填),--target-i、--target-tp、--target-lra,以及 --platform 预设。流程为:确认 ffmpeg 与 ffprobe 在 PATH;第一遍测量,运行 ffmpeg -i <input> -af loudnorm=I=<I>:TP=<TP>:LRA=<LRA>:print_format=json -f null - 并从 stderr 末尾解析 JSON;第二遍应用,运行 ffmpeg -i <input> -af loudnorm=I=<I>:TP=<TP>:LRA=<LRA>:measured_I=...:measured_TP=...:measured_LRA=...:measured_thresh=...:offset=...:linear=true:print_format=summary -c:v copy <output>,视频流原样复制;解析第二遍摘要;写出 manifest.json 与 verification.md。示例:scripts/loudnorm.sh --input ... --output ... --platform social。
质量检查:输出整体 LUFS 在目标 ±0.5 内;真峰值严格低于上限;视频流与输入逐字节一致(用 ffprobe 流 md5 校验);第一遍 JSON 正确解析,测量统计无 NaN。
限制与失败模式:单遍 loudnorm 会产生动态范围失真,必须两遍;ffmpeg 需 ≥ 3.1 且在 PATH;输入静音或直流时 measured_I 返回 -inf,应短路并输出 status: skipped_silent;极短片段(< 3 秒)loudnorm 窗口不可靠,需在 manifest 中给出警告。该技能被 /polish(audio-loudness 分支)、auto-refine(音频子循环)、edit-video(Phase 9 最终混音)消费。