vox-director的ffmpeg合成内幕:音乐ducking、烧录字幕与水印全流程
【免费下载链接】vox-directorTurn one topic into a finished Vox-style paper-collage explainer/ad video — automated end to end on Atlas Cloud + ffmpeg. An agent skill.项目地址: https://gitcode.com/gh_mirrors/vo/vox-director
vox-director 能把一个主题自动变成一支 Vox 风格纸拼贴解说视频,而最终的final.mp4全部由本地 ffmpeg 一次合成完成。这篇文章带你拆解 scripts/assemble.py 的完整流程:音乐 ducking(旁白出现时 BGM 自动压低)、烧录字幕、以及水印是怎么叠加上去的——全程没有一行手动剪辑。
为什么合成是最后一道关键工序
整条流水线是:节拍地图 → 关键帧 → 动效 → 配音 + 音乐 →合成。前五步各自产出素材,合成步骤 scripts/assemble.py 负责把多段镜头、逐 beat 的旁白、背景音乐拼成一支成品。它的核心思路在文件头注释里写得很清楚:
旁白和字幕按beat(节拍段落)组织,横跨该 beat 的所有镜头,所以画面可以尽情切,声音始终对齐;BGM 在旁白下方被 duck;字幕和水印是 Pillow 生成的 PNG,用
overlay合成。
第一步:镜头归一化与无损拼接
每段 AI 生成的短片段先被归一化为"精确时长的静音视频",这里有三个贴心细节:
- 慢放不冻帧:片段比旁白短?用
setpts微调放慢来填满,而不是tpad定格最后一帧; - 模糊填充背景:横竖比例不一致的素材(比如 3:4 卡片放进 9:16 画幅)会得到模糊放大版做背景,而不是黑边;
- 统一画布:统一缩放到 16:9 / 9:16 / 1:1 对应分辨率,24fps。
之后用concat协议(-c copy)把所有片段无损拼成一条无音轨的body_silent.mp4,避免二次编码损失画质。
第二步:音乐 ducking——旁白一出,BGM 自动让路
这是整篇文章的主角,对应 scripts/assemble.py 的音频滤镜链,流程是:
- 逐 beat 延迟对齐:每个旁白文件用
adelay推到其 beat 的起始毫秒处; - 混音并补齐时长:
amix混合后volume提升旁白,再apad+atrim把旁白轨垫到全片时长——这是关键坑:sidechaincompress的输出长度跟随"侧链",不补齐的话片尾纯音乐段会被-shortest直接剪掉(这个坑项目专门记录在 references/models-and-gotchas.md 里); - 旁白轨一分为二:
asplit复制出两路,一路参与混音,一路专门做 ducking 的侧链信号; - BGM 预处理:
atrim截齐总时长 →volume压低基础音量(默认 0.6,从 0.9 降下来就是为了让旁白主导)→ 结尾 2 秒afade淡出; - 侧链压缩:
sidechaincompress=threshold=0.02:ratio=12:attack=5:release=350——旁白一响,BGM 以 12:1 的比例迅速压低;旁白停顿后,350ms 的慢释放让音乐自然回升,听感顺滑不生硬。
这套参数保证了"人声永远听得清",同时背景音乐不抢戏、不突兀。
第三步:烧录字幕——为什么不用 drawtext?
本机 ffmpeg 是精简版,没有 libass 也没有 drawtext(缺 libfreetype)。vox-director 的解法很实用:用 Python + Pillow 把字幕画成透明 PNG,再用 ffmpeg 的overlay按时间窗口贴回视频。
scripts/text_overlay.py 提供两种字幕风格,在beats.json里用"caption_style"切换:
| 风格 | 效果 | 适用场景 |
|---|---|---|
white(默认) | 纯白字 + 深色描边 + 高斯模糊软阴影,无底条 | 干净克制的标准字幕感 |
paper | 奶油色剪纸字 + 墨色描边 +从关键帧自动取色的彩色 keyline | 拼贴风视频,字幕颜色随影片主色走 |
paper风格的亮点在accent_color():把关键帧缩到 80×80 量化后,按"饱和度×亮度×出现频次"打分挑出一个醒目色(墨西哥片→粉/青绿,唐代片→朱红),让每支片的字幕色调都与画面呼应。
叠加时机用overlay=0:0:enable='between(t,开始,结束)'控制——每个 beat 的字幕在其区间内出现,前后各留 0.2s / 0.1s 缓冲,切换干脆不拖影。字幕字号是min(W,H)×0.045,横竖屏都自适应,且刻意做得小,绝不遮挡拼贴画面。
第四步:水印——一行文字,全程在线
水印由 scripts/text_overlay.py 的render_watermark()渲染:奶油色小字 + 墨色描边,右下角定位(距边 30px),无黑色底框,默认文案是Made with Atlas Cloud · vox-director。
在滤镜链里,它是最后一个 overlay(字幕之后),全片无enable时间窗——即从头到尾常驻,但视觉上足够低调,不抢画面。想改文案?在beats.json里写一个"watermark"字段即可覆盖。
一次编码,产出成品
上面所有滤镜(N 条字幕 overlay + 水印 overlay + 完整音频链)打包进一条-filter_complex,视频libx264+yuv420p、音频 AAC 一次编码输出out/<项目>/final.mp4。少一次编码就少一次画质损失,速度也快得多。
想动手试?参考 examples/money-15s.beats.json 这类现成节拍文件,配合 SKILL.md 的六步工作流,让编码 Agent 帮你跑完全程——你只需批准节拍地图、挑一个喜欢的风格,剩下的交给 ffmpeg。
【免费下载链接】vox-directorTurn one topic into a finished Vox-style paper-collage explainer/ad video — automated end to end on Atlas Cloud + ffmpeg. An agent skill.项目地址: https://gitcode.com/gh_mirrors/vo/vox-director
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考