
OpenMontage FFmpeg 全链路实战Agent 视频管线的粗剪、增强与交付【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage导演 Agent 拿到一段 3 分钟的 Pexels 素材需要在 10 秒内产出一条 1080x1920 的竖屏短视频——剪切、变速、烧字幕、压音乐、按平台规格交付。这类任务不需要 AI 推理FFmpeg 一条命令链就能搞定。在 OpenMontage 中FFmpeg 就是 Agent 视频处理的确定性底座生成画面、合成语音走推理工具链而所有可预测的确定性操作统一收敛到一组 FFmpeg 包装工具上。下面按一条真实成片流水线的顺序把这条链走完。决策边界哪些活归 FFmpeg 干分工原则很简单需要理解内容的能力文生视频、人脸修复、超分走 AI 工具不需要推理、输入输出完全可预测的操作——剪切、变速、拼接、混音、字幕烧录、叠加、编码、调色、降噪——全部交给 FFmpeg 层工具。好处是 Agent 调用这些工具时结果稳定、可重试、可复现。工具负责的事video_trimmer剪切、修剪、变速、拼接片段video_compose完整合成多 cut 拼接 字幕 换音轨 编码audio_mixer混音、ducking、音频提取、分段配乐frame_sampler按策略抽取代表帧供质检与 AI 分析face_enhance皮肤平滑、锐化、冷暖色调color_grade电影感调色强度可调audio_enhance降噪、响度归一化、EQ所有工具只依赖一个系统命令装好即可用winget install FFmpeg # Windows brew install ffmpeg # macOS sudo apt install ffmpeg # Linux第一站素材进场与粗剪-c copy流拷贝是粗剪的默认选择不动帧、瞬时完成、零损耗。但它的边界很明确——只要帧内容或时间戳要变就必须重编码。这里设计逻辑最容易被忽视的一点video_compose生成每个 cut 片段时是强制 libx264 重编码的而不是图省事用-c copy。原因是-c copy只能对齐到关键帧Pexels 素材和 AI 生成片段常见稀疏 GOP关键帧间隔很长流拷贝剪出来的片段会显著长于目标时长直接打乱时间轴。源码注释把这条理由写得很直白video_compose.py牺牲速度换帧精确边界。拼接的两条路径。编码、分辨率、帧率完全一致的片段走 concat demuxer 流拷贝即可ffmpeg -f concat -safe 0 -i list.txt -c copy out.mp4混合素材不同编码/分辨率则必须先全部重编码归一化。video_compose是后者的完整落地每个 cut 先缩放到目标分辨率fitpad加黑边 /fitcover裁剪填充、setsar1、统一 30fps 和yuv420p再走 concat。归一化这步不能省否则 concat 会报 Non-monotonous DTS 或静默产出损坏文件。还有个隐藏坑很多 Pexels 素材根本没有音轨工具会用ffprobe探测video_compose.py无音轨时经 lavfi 注入anullsrc静音立体声轨保证所有片段的流布局一致video_compose.py。变速两条流一起动。视频侧用setpts{1/speed}*PTS改呈现时间戳音频侧用atempo。约束是atempo只接受[0.5, 100.0]区间极端倍速时 _build_atempo_chain 会链式拼接先串若干atempo100.0或atempo0.5最后补一个atempo剩余值收尾。所以 4 倍速是atempo2.01000 倍则是atempo100.0,atempo100.0,atempo0.1。第二站精修与增强多个增强步骤有固定顺序违反顺序滤镜会互相打架字幕烧录 → 人脸增强 → 调色 → 音频增强。为什么是这个顺序字幕烧录直接改画面像素必须最先落进基础视频如果先调色橙色调会被固化进皮肤后续平滑会把瑕疵一起放大所以人脸增强要在未调色的素材上做调色是全片定调放在人脸处理之后音频是独立领域最后单独处理。每一步都是可选的对应工具不可用时优雅跳过不会中断整条链。调色强度其实是混合不透明度。intensity不是线性缩放滤镜参数而是把原画面与调色后画面做 blendsplit[original][tograde]; [tograde]{vf}[graded]; [original][graded]blendall_modenormal:all_opacity0.85即0.85 85% 的调色效果color_grade.py。推荐值口播用cinematic_warmintensity: 0.850.5是微妙到几乎察觉不到1.0全效部分素材会过处理。内置 profile 有cinematic_warm、cinematic_cool、moody_dark、bright_clean、vintage_film、high_contrast、neutral七个滤镜组合另支持外部.cubeLUT。每个 profile 本质都是colorbalancecurveseq的组合例如cinematic_warm用colorbalance抬红/暖色、curves提阴影、eqcontrast1.05:saturation1.1加对比和饱和。人脸增强侧talking_head_standard是平滑 锐化 暖肤色三合一预设。编码上有个细节值得留意核心层工具 CRF 默认 23而face_enhance和color_grade默认 CRF 20——因为增强结果通常接近最终交付物画质预算要多给一点。第三站声音设计LUFS 响度怎么定先定目标再动手各平台响度基准如下平台目标 LUFS响度范围社交媒体TikTok/Reels-145-7 LUYouTube-14 ~ -167-11 LU播客-167-11 LU广播电视-247 LUaudio_enhance的clean_speech预设正是按 -16 LUFS / 11 LU 范围设计的滤镜链以loudnormI-16:LRA11:TP-1.5收尾其中TP-1.5是真实峰值上限负责兜底防削波audio_enhance.py。Ducking 实战语音压制音乐。用sidechaincompress以语音为 key signal语音出现时音乐被压缩语音结束后按 release 时间恢复。典型参数threshold0.02, ratio9, attack200ms, release500ms。audio_mixer的实际滤镜图audio_mixer.py[1:a]sidechaincompressthreshold0.02:ratio9:attack0.2:release0.5:level_sc1:mix0.9[ducked]; [ducked]volume{music_vol*3}[music_out]; [0:a][music_out]amixinputs2:durationlongest[out]注意第二行的volume{music_vol * 3}sidechain 压缩会把音乐电平整体拉低这里乘 3 是补偿这部分损失music_vol本身来自duck_leveldB 转线性-12dB ≈ 0.25。两种输入格式简单格式更推荐给 Agent{operation: duck, primary_audio: speech.mp3, secondary_audio: music.mp3, duck_level: -12, output_path: out.wav}{operation: duck, tracks: [ {path: speech.mp3, role: primary}, {path: music.mp3, role: secondary}], output_path: out.wav}进阶编排。full_mix一次滤镜图内完成多层旁白按start_seconds排布 音乐 ducking 响度归一化配合target_duration用apad/atrim把音频精确对齐成片时长——ducking 的音乐尾音会随旁白结束而消失所以必须以视频时长为权威长度。segmented_music则做时间分段配乐用volume表达式只在segments指定的区间如{start: 0, end: 17.0}出声并带平滑淡入淡出实现口播段有音乐、展示段静音的精细控制。第四站包装与交付字幕烧录的三个坑字幕烧录的坑集中在四点。其一简单词级字幕优先用 SRT。其二force_style的颜色必须用完整 ASS 格式H00FFFFFFAABBGGRR含透明度字节写成HFFFFFF会解析错。其三Windows 路径必须转义滤镜里写C\:而不是C:源码拼滤镜前执行replace(\\, /).replace(:, \\:)。其四竖横屏参数不同画幅font_size每条最大词数margin_v竖屏 9:16183 词50横屏 16:9226 词40样式来源有四层优先级显式subtitle_styleedit_decisions.subtitles.style playbooktypography/color_palette 内置默认video_compose.py避免所有视频都长成白色 Arial 粗体。平台规格不用记参数。video_compose传入profile即可拿到平台内置规格lib/media_profiles.pyprofile规格CRFyoutube_landscape1920x1080 30fps18tiktok1080x1920 竖屏20cinematic2560x1080 24fps16不想命名 profile 时compose_target可请求任意分辨率fitpad加黑边保留全部内容fitcover缩放填充后居中裁剪更适合竖屏社交。交付前抽帧质检。frame_sampler有四种策略scene_guided最有价值策略参数实现方式intervalinterval_secondsfps1/{interval}均匀抽帧countcountffprobe 取时长后等间隔抽 N 帧timestamps时间戳数组每个点-ss ts -frames:v 1scene_guided场景边界 max_frames每场景首帧0.1s 偏移避黑帧超 3s 场景加中点帧scene_guidedframe_sampler.py的独特之处在于有界均匀 fps 抽帧要么漏掉短镜头转场、要么帧数爆炸而它以镜头边界为准用可预测的帧数覆盖全片所有视觉转场去重排序后限流到max_frames默认 20是喂给video_understand、visual_qa做质检的理想输入。参数速查工具关键入参video_trimmeroperation∈ cut/speed/concatstart_seconds/end_seconds≥ 0speed_factor∈ [0.1, 100]codec默认copyvideo_composeoperation∈ compose/render/remotion_render/burn_subtitles/overlay/encodecrf默认 23preset默认 mediumprofile可选平台画像audio_mixeroperation∈ mix/duck/extract/full_mix/segmented_musicloudnorm_target∈ [-40, 0] 默认 -16attack_ms200 /release_ms500 /music_volume_during_speech0.15frame_samplerstrategy四种quality∈ [1, 31] 默认 2jpg 生效max_frames默认 20face_enhancepreset默认talking_head_standardcrf默认 20支持presets数组与custom_vfcolor_gradeprofile默认cinematic_warmintensity∈ [0, 1] 默认 1.0支持lut_path与custom_vfaudio_enhancepreset默认clean_speechaudio_codec默认 aac、audio_bitrate默认 192k支持custom_af⚠️ 踩坑与验收高频误区Windows 路径未转义就塞进subtitles滤镜报参数解析错误——记得C\:写法用-c copy做帧精确剪切稀疏 GOP 下片段时长悄悄超标时间轴整体漂移调色排在人脸增强之前暖色调固化进皮肤后续平滑放大瑕疵Pexels 素材无音轨未注入静音轨就进 concat直接报流布局错误竖屏视频套用横屏字幕参数大字 6 词长句溢出画面响度一律默认 -16 投放TikTok 上比竞品声音小一截交付前自检音画同步变速片段重点听setpts/atempo必须成对出现响度落在目标平台区间内对照第三站的 LUFS 表字幕位于画面底部 20% 区域不遮挡人脸剪切点无音频削波和静音间隙文件大小对平台合理延伸阅读技能文档skills/core/ffmpeg.md核心实现video_trimmer.py、audio_mixer.py【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考