人工智能AI Agent大模型AI 应用媒体生成【免费下载链接】xiaobei为OPC/中小微企业量身打造的自媒体获客智能体项目地址https://gitcode.com/gh_mirrors/wi/xiaobei点击查看免费下载本文围绕 xiaobei 仓库中 crews/content-producer内容生产 Crew的后期脚本体系展开完整讲解normalize.py、burn-srt.py、duck.py、denoise.py、interp.py五款基于 ffmpeg 的后期处理脚本的用途、调用方式、参数语义与底层实现原理。读者将掌握何时必须跑、何时可选跑、每个脚本的默认参数与可调范围、干湿分离约定、旁路退出条件以及多步骤串联的正确顺序从而在端到端视频生产工作流中正确落地响度归一化、字幕硬烧、BGM 闪避、音频降噪、补帧五个后期环节。背景五个脚本在整个生产链中的位置content-producer 是 xiaobei 仓库中的专业内容制作 Crew其核心技能 video-producer 走 Stage 0→14 的端到端生产链意图路由 → 故事 → 剧本 → 分镜 → 素材 → 闸门 → 渲染 → 自检 → 交付。后期处理位于 Stage 12assemble拼接成片与 Stage 13video-review自检之间——成片合成之后、汇报交付之前用这五个脚本补齐没做的后期环节。按 scripts/README.md 的定位这五个脚本被严格划分为两个必跑、三个可选必跑normalize.py响度归一化——发布质量硬伤不跑是硬伤可选burn-srt.py、duck.py、denoise.py、interp.py——用户明确要求才跑。完整的接入契约落点 / 旁路条件 / 干湿分离记录在 AGENTS.md 与 video-producer SKILL.md 的## 脚本清单与## 阶段链段落scripts/README.md只做速查索引。本文在索引基础上结合五个脚本的源码实现crews/content-producer/scripts/*.py逐层展开。五脚本速查索引脚本用途必跑/可选落点normalize.pyffmpeg loudnorm 双 pass 把成片归一化到 -14 LUFS抖音/视频号/B 站竖屏发布通用标准必跑AGENTS.md Step 5.5exportMp4 出片后、汇报前强制跑burn-srt.pyffmpegsubtitles滤镜libass把 SRT 硬烧进画面不可关可选Step 5.6仅用户明确要字幕时跑duck.pyffmpegsidechaincompress旁白作 sidechain 触发 BGM 自动压低threshold-25dB / ratio8:1可选Step 5.7仅用户要专业混音且可分轨时跑denoise.pyffmpegafftdn默认或arnndnRNN要模型文件给音频去环境噪声可选Step 3.5仅用户素材音质差时跑AI 生成视频音轨本来就干净跳过interp.pyffmpegminterpolate补帧到 30/60fps可选Step 5.8仅低 fps 源材如 24fps AI 生成片补到 30fps 顺滑五个脚本都是独立 Python 文件位于 crews/content-producer/scripts/均支持--help查看完整入参。与 video-producer 的子命令脚本assemble.py、clip-trim.py、audio-mix.py等不同这五个脚本由 content-producer 工作流在成片阶段直接调用且明确遵守禁止直接写 ffmpeg 命令的纪律——所有 ffmpeg 调用都收敛在这几个子命令脚本内。必跑环节normalize.py 响度归一化-14 LUFS 双 pass为什么 -14 LUFS 是发布质量硬伤源码 docstringnormalize.py给出了明确理由抖音/视频号/B 站竖屏发布通用标准与平台播放器电平匹配避免在我机 sound bar 听着正但手机刷到时偏轻/偏响是短视频行业的 de-facto 标准。这条是必跑步骤——但脚本本身尊重--skip时的跳过行为是否强制由调用方AGENTS.md 工作流决定。默认参数与可调项源码顶部的常量即平台通用标准normalize.py除非平台规范变了不建议动这套阈值参数CLI 选项默认值语义目标响度--target-lufs-14.0LUFS短视频平台通用标准真实峰上限--true-peak-1.5dB留 0.5dB headroom 避削顶Loudness Range--lra11.0短视频通用 7–13取中平滑触发阈内部常量-20.0dBindustry de-facto双 pass 实现原理与直接跑一遍loudnorm不同脚本实现了严格的双 passnormalize.pyPass 1测量ffmpeg -af loudnorm...:print_formatjson只解码不输出探测当前响度、真实峰、阈值测量 JSON 落在stderr而非 stdout源码中通过err.index({)到err.rindex(})截取解析。Pass 2应用把 Pass 1 测得的measured_I / measured_TP / measured_LRA / measured_thresh / offset传回loudnorm并以lineartrue做真归一化而不是再跑一遍单 pass。性能优化若input_i已在目标 ±0.3 LUFS 内脚本直接shutil.copy2拷贝输入而不重渲染normalize.py省时间并避免不必要重压缩。视频/音频编码固定为libx264 / preset medium / crf 18、aac / 192k、-movflags faststart——保证出片可流式播放。调用模板# 响度归一化必跑 python3 ./scripts/normalize.py video.mp4 --output out.mp4 # 默认 target -14 LUFS / true peak -1.5 dB / LRA 11 # 显式覆盖参数 python3 ./scripts/normalize.py video.mp4 --target-lufs -16 --true-peak -1.0 --lra 9 --output out.mp4不传--output时输出自动落在输入旁{stem}_normalized.mp4源码 normalize.py且父目录自动创建mkdir(parentsTrue, exist_okTrue)。退出码语义退出码含义0归一化完成含已达标直接拷贝1参数错 / ffmpeg 缺失 / 输入不存在2ffmpeg loudnorm 失败含不可恢复的音频畸变——旁路条件无声轨或音频畸变时退回 exportMp4 重生可选环节一burn-srt.py 字幕硬烧libass / force_style适用场景与前置条件脚本只在用户明确说要字幕/烧字幕/hardcode subtitles时才跑docstring 明确标注⚠️ 可选步骤不是必跑。硬烧与软字幕.srt 外挂、平台播放器可开关不同——硬烧适合平台不支持外挂字幕或想保证画面字一定显示的场景。默认工作流assemble.py/ exportMp4不烧字幕。硬性前置检查burn-srt.pyffmpeg -filters探测必须含subtitles滤镜即 ffmpeg 编译时带 libassUbuntu 默认 ffmpeg 带否则exit 1报错建议改发外挂 SRTSRT 校验文件非空 至少含一个--时间戳分隔符否则exit 1。默认字幕样式源码 burn-srt.py 的默认样式是黑白配 半透底框的短视频通用可读样式FontNameNoto Sans CJK SC, FontSize24, PrimaryColourH00FFFFFF, OutlineColourH00000000, BackColourH80000000, BorderStyle4, Outline2, Shadow1, Alignment2, MarginV40FontName默认Noto Sans CJK SC中文兜底libass 找不到时回退 fontconfig 默认中文渲染必须用force_styleFontName...强制字体否则 libass 默认字体可能不含中文 glyph。调用模板# 字幕硬烧可选 python3 ./scripts/burn-srt.py video.mp4 subs.srt --output out.mp4 # 默认中文字幕样式 Noto Sans CJK SC 24px # 覆盖字体/字号/样式 python3 ./scripts/burn-srt.py video.mp4 subs.srt --font-name PingFang SC --font-size 28 python3 ./scripts/burn-srt.py video.mp4 subs.srt --force-style FontName...:FontSize...:...实现要点burn-srt.py滤镜串为subtitlesfilename...:force_style...路径经shlex.quote转义后再包单引号视频轨走libx264 / medium / crf 18重编码音轨-c:a copy原样不动。输出默认stem_burned.mp4不覆盖输入。可选环节二duck.py BGM 自动闪避sidechaincompress何时才能用可分轨是硬前提脚本 docstring 明确说明了适用边界的现实约束duck.pyAI 声画同出模式gen.py 出的片是混轨单声道无法从混轨里分离 BGM 和旁白duck.py 实际只能在以下场景使用assemble.py走 Stock Footage TTS 模式素材视频含 BGM/环境音 外挂 speech.mp3 旁白——BGM 在视频轨、旁白在音频轨可分离用户人工提供了 BGM.mp3 和 narration.mp3 两份独立文件tts.py生成的旁白是独立文件BGM 也是独立文件。顺序纪律ducking 改的是轨间电平normalize 改的是整体响度因此必须先 duck 再 normalize顺序不能反。默认参数与 dB→线性转换参数CLI 选项默认值语义触发阈值--threshold-25.0dB旁白起来到这 dB 才触发 BGM 压低压缩比--ratio8.08:1压狠Attack--attack5ms起得快但不抖Release--release300ms放得慢旁白停了 BGM 缓升Makeup--makeup3.0dBBGM 被压后补一点避免整体偏轻关键技术细节duck.pyffmpegsidechaincompress的 threshold / makeup 参数要求线性振幅[0,1] 归一化而非 dB脚本用db_to_linear(dB) 10 ** (dB/20)做转换后再塞给 ffmpeg。两种输入模式模式 1视频自带 BGM 外挂旁白duck.pypython3 ./scripts/duck.py video.mp4 narration.mp3 --output out.mp4滤镜图[0:a]BGM 整轨给sidechaincompress的 main 输入不 split省一个闲输出[1:a]旁白asplit2一份作 sidechain 触发源、一份最终混入最后amixinputs2:durationlongest:dropout_transition0出最终音轨。视频轨-c:v copy原样不动。模式 2外挂 BGM 外挂旁白python3 ./scripts/duck.py video.mp4 narration.mp3 --bgm-source bgm.mp3 --output out.mp4滤镜图三输入[2:a]BGM 整轨给 main[1:a]旁白asplit2[side][nar][nar] [mixed]amix 出最终音轨duck.py。旁路条件视频无声轨且没传--bgm-source→ 脚本用 ffprobe 探测音频流数量probe_audio_streams为 0 时exit 1duck.py。AI 声画同出混轨没法分 → 报告用户等决策不硬跑。可选环节三denoise.py 音频降噪afftdn vs arnndn只对用户素材用AI 生成不用脚本 docstring 强调AI 生成视频的音轨是干净的不需要降噪。只有在用户素材音质明显差环境噪声大、空调嗡、键盘吱或review.py报噪声指标异常时才跑。落点在素材处理阶段Step 3 用户素材预处理而不是合成产物之后——合成后再降噪会伤及片段间衔接处的环境音一致性denoise.py。两种降噪方法怎么选方法原理依赖适用afftdn默认FFT 频域降噪nfnoise floor/nrnoise reduction/ntnoise type无外部模型环境噪声 dominant、人声次要保守不伤人声arnndnAcoustic RNN Noise Suppress NetworkRNN 降噪需.rnn模型文件--rnn-model必传素材主要传人声对人声保真更好默认参数保守不伤人声参数CLI 选项默认值语义降噪方法--methodafftdnafftdn/arnndn二选一Noise Floor--noise-floor-40.0dBafftdn 的噪声底降噪强度--nr12.0dB范围 0.01–97默认 12 已够用噪声类型--noise-typewhitewhite/vinyl/shellac/custom调用模板与旁路# 音频降噪可选仅素材音质差时 python3 ./scripts/denoise.py user-footage.mp4 --output out.mp4 # 默认 afftdn无外部模型依赖 # 要更强降噪走 arnndn需模型文件 python3 ./scripts/denoise.py user-footage.mp4 --method arnndn --rnn-model model.rnn --output out.mp4 # 微调 afftdn 参数 python3 ./scripts/denoise.py video.mp4 --noise-floor -40 --nr 12旁路/退出条件denoise.pyffmpeg 不带afftdn/arnndn滤镜 →exit 1提示换 ffmpeg-full 或改用另一方法arnndn没传--rnn-model或模型文件不存在 →exit 1视频无声轨 → ffprobe 探测为空exit 1降噪没意义视频轨-c:v copy原样不动音频重编码aac / 192k。可选环节四interp.py 补帧minterpolate适用边界源 fps target fps 才跑只在低 fps 源材如 24fps AI 生成片、15fps 用户素材补到 30fps 顺滑——发布平台播放器默认 30fps 起低于这个画面会卡。默认工作流不动 fps仅当源 fps target fps且用户要补帧/顺滑/提升帧率时才跑。自动跳过优化interp.py脚本先ffprobe取r_frame_rate解析为浮点处理30/1、30000/1001这类分数帧率若源 fps ≥ target fps 则直接shutil.copy2拷贝输出并以exit 0结束避免浪费和不必要重压缩。两种补帧模式模式CLI 值特性blend默认--mode blend纯加权混合快、无鬼影但运动糊——保守首选mci--mode mcimotion compensated interpolation更顺但慢高运动场景易出鬼影ffmpeg mci 算法不如商业方案稳调用模板与自动降级# 补帧可选仅低 fps 源材 python3 ./scripts/interp.py video.mp4 --target-fps 30 --output out.mp4 # 默认 minterpolate modeblend # 要更顺走 modemcimotion compensated但慢且可能出鬼影 python3 ./scripts/interp.py video.mp4 --target-fps 60 --mode mci自动降级逻辑interp.pymci模式渲染失败出鬼影/算法崩exit 2时脚本自动捕获SystemExit并退blend模式重试打印[warn] mci 模式渲染失败退 blend 模式重试更稳但运动糊。视频重编码libx264 / medium / crf 18-pix_fmt yuv420p音轨-c:a copy。ffmpeg 不带minterpolate滤镜 →exit 1。干湿分离约定输出命名与串联规则五个脚本都遵守同一套干湿分离约定README 明确声明输出落stem_处理名.mp4不覆盖输入normalize.py→{stem}_normalized.mp4burn-srt.py→{stem}_burned.mp4duck.py→{stem}_ducked.mp4denoise.py→{stem}_denoised.mp4interp.py→{stem}_interp.mp4多步串联时下一步以上一步产物为输入原产物保留作回退。典型串联示例遵循先 duck 再 normalize的顺序纪律# 1) 素材阶段降噪仅用户素材音质差时Step 3.5 python3 ./scripts/denoise.py user-footage.mp4 --output footage_denoised.mp4 # 2) 成片后 BGM 闪避需可分轨Step 5.7先于 normalize python3 ./scripts/duck.py video.mp4 narration.mp3 --output video_ducked.mp4 # 3) 响度归一化必跑Step 5.5最后做整体响度 python3 ./scripts/normalize.py video_ducked.mp4 --output video_final.mp4若用户还要字幕或补帧则插在对应位置字幕烧录与补帧都作用于画面与音频处理链相互独立可放在任意合适顺序但保持每步以上一步产物为输入。旁路条件速查表脚本设计上充分考虑了ffmpeg 能力探测 输入校验 优雅降级所有旁路都在调用前或调用中显式处理脚本旁路条件行为normalize.py无声轨 / 音频畸变exit 2 报错退回 exportMp4 重生normalize.pyinput_i 已在 ±0.3 LUFS of target自动跳过渲染直接拷贝burn-srt.pyffmpeg 不带 libassexit 1 报错改发外挂 SRTburn-srt.pySRT 不存在 / 格式错无--exit 1duck.pyAI 声画同出混轨没法分报告用户等决策不硬跑duck.py视频无声轨且没--bgm-sourceexit 1denoise.pyAI 生成视频音轨干净跳过denoise.pyffmpeg 不带 afftdn/arnndnexit 1denoise.pyarnndn 没传--rnn-modelexit 1interp.py源 fps ≥ target fps自动跳过拷贝exit 0interp.pyffmpeg 不带 minterpolateexit 1interp.pymci 模式出鬼影自动退 blend 模式重试这套旁路设计让脚本可以被工作流安全调用能跑则跑不能跑则明确报错可捕获的 exit code而不是静默产出坏片。环境依赖与运行前提运行环境python3 ffmpeg ffprobevideo-producer SKILL.md 的 metadata 声明要求三个 bin 齐备requirements.txt依赖requests供各脚本 HTTP 调用但本组五个后期脚本均为纯 ffmpeg 子进程调用无第三方 Python 库依赖。ffmpeg 版本要求afftdn的参数形态nf/nr/nt以 ffmpeg 6 为准denoise.py 注释明确Ubuntu 默认 ffmpeg 带 libasssubtitles滤镜但minterpolate、afftdn、arnndn等滤镜若缺失脚本会通过ffmpeg -filters探测并报错提示换ffmpeg-full。每个脚本都支持--help五个脚本均使用标准argparse定义入参运行python3 ./scripts/script.py --help可查看完整参数说明与默认值。工作流纪律这些脚本由 content-producer 工作流AGENTS.md / video-producer SKILL.md在对应落点强制或按需调用禁止 Agent 直接手写 ffmpeg 命令绕过脚本video-producer SKILL.md 的禁止事项段明确禁止直接写 ffmpeg 命令所有 ffmpeg 调用走子命令脚本。总结从索引到源码的完整理解scripts/README.md是一个高度精炼的脚本速查索引而它的全部技术细节都落在五个 Python 文件中。从源码层面可以确认的通用设计模式包括统一的双层退出码约定0 成功 / 1 参数或环境问题 / 2 渲染失败、统一的干湿分离输出命名{stem}_{处理名}.mp4、统一的 ffmpeg 能力前置探测ffmpeg -filters/ffprobe检查缺滤镜即 exit 1 而非白跑、统一的渲染编码约定libx264aac 192k-movflags faststart。理解这五点就掌握了 content-producer 后期脚本体系的全部规律也就能在真实生产链中安全地组合使用两跑三选五个后期环节。赞分享人工智能AI Agent大模型AI 应用媒体生成【免费下载链接】xiaobei为OPC/中小微企业量身打造的自媒体获客智能体项目地址https://gitcode.com/gh_mirrors/wi/xiaobei点击查看免费下载相关推荐Video2X视频教程OBS录制与ffmpeg后期处理工作流Video2X视频教程OBS录制与ffmpeg后期处理工作流 想要制作高质量的视频内容掌握OBS录制与Video2X后期处理工作流是关键 本教程将带你音视频视频处理图像处理深度学习LocalAI开源引擎在本地硬件上部署全栈AI解决方案的技术实践LocalAI开源引擎在本地硬件上部署全栈AI解决方案的技术实践 LocalAI作为开源AI引擎让用户能够在任何硬件上运行各类AI模型——包括大型语言模型、人工智能大模型模型推理服务本地部署LLM 网关多模态AI AgentRAGMCP 服务上一篇终极免费开源回放管理神器ReplayBook完整使用手册下一篇英雄联盟回放分析神器ROFL播放器全面使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考