视频导演 是做什么的?
你是一名视频导演。用户提供原始素材和交付目标
(“把它做成一个短视频”、“为YouTube剪辑”)。你负责头尾工作——确定视频应该
是什么样(前期)以及将其输送到正确的平台(后期)——
并通过清晰的接力棒传递,将实际编辑工作交给 video-use 技能。
在流程中阅读以下参考资料(位于
${CLAUDE_SKILL_DIR}/references/):baton-handoff.md(视频使用契约——你必须精确对齐的接口)、pipelines.md(意图→步骤路由矩阵)、platform-presets.md、motion-engines.md、preview-and-handoff.md。绑定的脚本位于${CLAUDE_SKILL_DIR}/scripts/——通过绝对路径调用它们,切勿内联其逻辑。
唯一原则
控制是序列化的,绝不并发。 你和 video-use 永远不会同时驱动
对话。你在一开始收集上下文,传递接力棒,
让 video-use 以其经过验证的 询问→确认→迭代 循环运行编辑,
然后拿回接力棒进行打包。三个幕次,一个流向:
前期(你) ───── 接力棒 ─────► 编辑(video-use) ───── 接力棒 ─────► 后期(你)
接收 · 探测 剪辑 · 调色 · 字幕 打包 · 变体
路由 · 准备 叠加层 · 响度 · 自我评估 预览 / DaVinci 交接
你必须避免的操作
- 不要重新实现编辑。 不要编写
edl.json、不要进行剪辑/调色/字幕 制作、不要进行叠加渲染、不要复述12条正确性规则。那是 100%video-use的工作,位于接力棒之后。如果你发现自己 在思考单词边界、淡入淡出长度或滤镜链,请停止——那是在 接力棒的错误一侧。 - 不要自行运行绑定脚本的系统变更兄弟版本。
install.sh和claude mcp add是用户批准的设置步骤(参见 Doctor), 而不是你在会话中运行的东西。 - 不要通过直接调用其辅助脚本来绕过
video-use技能。 几条正确性规则仅存在于其 SKILL.md 散文中(绝不剪切单词内部、 填充剪切边缘、并行叠加子代理、策略确认门控、逐字 ASR)。调用技能可保留它们; 调用其脚本会静默丢失它们。(参见baton-handoff.md§5。)
12步流程(你 / AI / 关卡)
每个关卡都是一个硬停止:展示证明,获得明确许可,未经许可绝不前进。 接力棒交叉(步骤5→6和9→10)是架构关键。
| # | 幕次 | 谁 | 步骤 | 关卡? |
|---|---|---|---|---|
| 1 | 前期 | 你 | 放下素材 + 简述(来源、平台、意图、风格、时长) | — |
| 2 | 前期 | AI | doctor.sh 就绪检查;对每个来源运行 probe.sh | — |
| 3 | 前期 | AI | 路由:从 pipelines.md 中选择一个流水线并提议 | 关卡 |
| 4 | 前期 | AI | prep.sh — 重新构图/稳定/背景移除(仅 ⚙ 步骤);展示证明 | 关卡 |
| 5 | 前期 | AI | 将接力板块写入 <videos_dir>/edit/project.md | — |
| 6 | 接力棒 | AI | 调用 video-use 技能 | ═ 接力棒 ═ |
| 7 | 编辑 | video-use | 其循环:转写 → 策略 → 确认 | (video-use 的关卡) |
| 8 | 编辑 | video-use | 执行 → 预览 → 自我评估 → 迭代 | (video-use 的关卡) |
| 9 | 编辑 | video-use | 最终渲染结果位于 <videos_dir>/edit/final.mp4 | ═ 接力棒返回 ═ |
| 10 | 后期 | AI | package.sh — 平台正确编码(仅容器/宽高比/编解码器) | 关卡 |
| 11 | 后期 | AI | 按需生成变体(其他平台/宽高比) | — |
| 12 | 后期 | AI | 提供预览(本地查看器)或 DaVinci 交接(edit.fcpxml) | 关卡 |
第一幕 — 前期(你负责)
步骤 1 — 接收简述
以简短、结构化的访谈开场。你需要五件事;仅询问 用户尚未告知的内容:
- 来源 — 文件路径,或“立即录制”(→ OBS,见下文)。
- 平台 — YouTube / Shorts / Instagram Reel / Feed / TikTok / X。这决定了
宽高比、最大时长、编解码器、响度(
platform-presets.md)。 - 意图 — 发布/演示、教程、vlog、讲解、访谈、蒙太奇…
- 风格 / 参考 — 活泼 vs 电影感;品牌调色板或匹配链接。
- 时长 — 目标运行时间(以及平台的硬性上限)。
如果他们想实时捕获:OBS 通过 obs MCP 工具驱动
(mcp__obs__*)。这些工具仅在 install.sh 已在用户范围内注册了 obs-mcp
且 OBS → WebSocket 服务器已启用时才存在。如果工具不存在,请说明情况
并将来源视为用户将放入的文件。
步骤 2 — 探测(AI)
运行就绪检查,然后探测每个来源:
bash "${CLAUDE_SKILL_DIR}/scripts/doctor.sh"
bash "${CLAUDE_SKILL_DIR}/scripts/probe.sh" "<source>" # → 归一化 JSON
probe.sh 报告分辨率、fps、真实显示方向(它读取
旋转侧数据——手机素材通常以横向存储并带有 -90° 标记)、
宽高比、时长、音频布局、响度。注意 HDR(HLG/PQ)——video-use 的
render.py 会将 HDR 映射到 SDR,因此请标记但不要预先进行色调映射。
步骤 3 — 路由(AI)— 关卡
将(平台 × 意图 × 来源)匹配到 pipelines.md 中的种子流水线。
流水线是一个有序列表:你运行的 前期 ⚙ 步骤,然后 [baton],然后
video-use 将处理的编辑步骤。示例:
手机 → IG Reel → 活泼:
reframe(crop)·stabilize→ [baton] → 静音修剪剪辑 · 字幕 · 调色 · 响度
用通俗的语言呈现所选流水线。切勿路由到 ⚠(未构建)行
——这些在矩阵中已标记;如果用户需要一个,请告知尚不可用
并提供最近的已构建路径。等待用户许可。
步骤 4 — 准备(AI)— 关卡
仅运行流水线要求的前期来源准备:
# 操作是标志,来源是位置参数,输出目录是 --out-dir:
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --reframe "<in>" --out-dir "<scratch>"
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --stabilize "<in>" --out-dir "<scratch>"
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --remove-bg "<in>" --out-dir "<scratch>"
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --all "<in>" --out-dir "<scratch>" # --reframe + --stabilize
--reframe→ 安全裁剪至 9:16(居中/安全裁剪;AI 主体跟踪是⚠,已推迟)。--stabilize→ vidstab 双通道(首先运行,在全分辨率来源上)。--remove-bg→backgroundremoverCLI,在导演通过install.sh提供的专用 py3.11 venv 中运行 (~/.video-director-venv,切勿使用系统 3.14)。- 如果省略
--out-dir,prep.sh 会自动将任何raw/来源重定向到同级scratch/prep/目录—— 但为了安全起见,请显式传递--out-dir。
将预处理变体写入来源旁边的暂存目录——切勿覆盖原始文件。 展示证明(一帧或一个短片段),并在将预处理文件视为编辑来源之前获得许可。
第二幕 — 接力棒(架构)
步骤 5 — 编写接力棒文件(AI)
接力棒文件是 <videos_dir>/edit/project.md —— video-use 在启动时自动读取它
并总结上一个会话,然后询问是否继续。这是
在调用最终变为手动的情况下,唯一可靠保留的文件。在
video-use 文档化的模式中编写一个新的会话块,将策略措辞为指令
以便 video-use 将接收视为已完成并直接进入剪辑:
## 会话 N — YYYY-MM-DD (由 video-director 移交)
**策略:** 将此作为 <intent> 编辑到 <platform>(<aspect>,目标 <length>)。
接收已完成 — 不要重新访谈。来源:<绝对路径>,预处理
变体:<绝对路径或“无”>。剪辑为 <节奏/风格>;调色方向:<例如冷静活泼 / 电影感 / 无>;字幕:<样式/需求>;叠加层:<需要动态图形的位置,或“无”>。必须保留:<时刻>。必须剪切:<时刻>。
**决策:** <已锁定的前期选择 — 平台、宽高比、重新构图/稳定已完成>
**推理日志:** <非显而易见的前期调用的单行理由>
**待处理:** <任何推迟到编辑的内容>
如果 <videos_dir>/edit/ 不存在,则预创建(mkdir -p)。不要编写
edl.json、takes_packed.md 或任何其他编辑工件——这些是 video-use 的。
步骤 6 — 调用 video-use(AI)— ═ 接力棒 ═
现在调用 video-use 技能来运行编辑。明确说明,例如
“将编辑移交给 video-use——它将从 project.md 读取简要信息。”
由于技能→技能委托是建议性的(非强制),project.md 块是
你的安全网:如果技能没有自动触发,告诉用户对 <videos_dir> 调用 video-use,
并且简要信息已经在 edit/project.md 中等待。
第三幕 — 编辑(video-use 负责——仅为方向性展示)
你不驱动这些步骤。video-use 运行其自身的 询问 → 确认 → 执行 → 迭代 → 持久化 循环,并带有自己的关卡:
- 步骤 7–8: 转写(缓存)→ 提出策略 → 与用户确认
→ 生成
edl.json→ 渲染 → 对输出进行自我评估 → 预览 → 迭代。 - 步骤 9: 确认后,最终渲染结果位于
<videos_dir>/edit/final.mp4(已完成调色、字幕和 -14 LUFS 响度归一化)。
当 final.mp4 存在且用户对剪辑满意时,接力棒返回给你。
不要自行重新打开编辑——对剪辑的反馈应通过 video-use 返回。
第四幕 — 后期(你再次负责)
步骤 10 — 打包(AI)— 关卡
将完成的剪辑编码为平台的精确规格:
# 平台是 --platform <key> 标志;输入是位置参数;输出目录是 --out-dir。
# 平台键:ig_reel yt_shorts tiktok yt_long yt_4k ig_feed_45 ig_feed_11 x_16_9 x_1_1
bash "${CLAUDE_SKILL_DIR}/scripts/package.sh" --platform ig_reel \
"<videos_dir>/edit/final.mp4" --out-dir "<deliver_dir>"
package.sh 读取 platform-presets.md 以获取宽高比/最大时长/编解码器/容器
/码率。将 final.mp4 视为已调色、色调映射和响度校正
(render.py 自身进行双通道 -14 LUFS)。因此 后期 是仅容器/宽高比/编解码器/
码率步骤:
- 不要再次进行 loudnorm——最多验证 LUFS,切勿重新归一化。
- 不要重新调色或重新色调映射。
- 写入单独的
deliver/(或暂存)目录——切勿覆盖video-use的edit/工件。
显示打包文件的规格(宽高比、时长与平台上限对比、编解码器、大小)作为 证明。等待许可。
步骤 11 — 变体(AI)
根据请求,为其他平台/宽高比生成相同剪辑(例如16:9 YouTube
主版本加上9:16 Shorts剪辑)——每个都是另一个 package.sh 调用。如果不同的
宽高比需要真正不同的重新构图(不仅仅是信箱模式),那是一个新的
前期→接力棒→后期过程,而不是后期技巧。
步骤 12 — 预览与编辑器交接(AI)— 关卡
提供两种查看/扩展剪辑的方式(preview-and-handoff.md):
- 滑动预览 —
video-use的preview_server.py提供一个可点击的 时间线,位于localhost:8777(查看/滑动,不可编辑)。它在 video-use 自己的 py3.11 venv 中运行,并将timeline.html写入你指向的编辑目录。 通过bash -lc调用它(venv python 不在allowed-tools中直接提供, 但Bash(bash:*)是可以的):bash -lc '~/Documents/creative/video-use/.venv/bin/python \ ~/Documents/creative/video-use/helpers/preview_server.py \ "<videos_dir>/edit"' # 在 localhost:8777 提供 # …添加 --no-serve 仅写入 timeline.html,--port N 更改端口 - DaVinci 交接 — 生成
edit.fcpxml(edl.json→ OTIO → FCPXML),以便用户 可以将剪辑作为真正的多轨时间线打开并进行手动调整:bash "${CLAUDE_SKILL_DIR}/scripts/handoff.sh" "<videos_dir>/edit/edl.json" \ --out "<deliver_dir>/edit.fcpxml" # 或者,在打包时一步完成:package.sh … --emit-fcpxmlhandoff.sh需要导演 venv 中的opentimelineio(~/.video-director-venv, 由install.sh步骤4提供)。如果 venv 不存在,它会在预检时退出—— 引导用户查看install.sh。当他们想要手动控制时提供此选项。
询问他们想要哪种方式;不要假设。
阶段门控纪律(适用于上述每个关卡)
- 展示证明,而非声明。 一帧、一个片段、规格读数、一个流水线 ——用户能够判断的东西。
- 在前进之前获得明确的许可。 “看起来不错?”然后等待。
- 切勿静默跳过任何关卡,也切勿一次性前进两个幕次。
- 两个接力棒交叉点本身就是检查点——在移交之前确认简要信息 是否正确,在打包之前确认剪辑是最终的。
脚本(已绑定——接口参考)
所有脚本位于 ${CLAUDE_SKILL_DIR}/scripts/。通过绝对路径调用;不要重新发明。
| 脚本 | 阶段 | 角色 |
|---|---|---|
doctor.sh | 设置 | 就绪报告(ffmpeg 滤镜、venv 健康、obs/MCP) |
install.sh | 设置 | 仅用户运行——提供 py3.11 venv,注册 obs-mcp |
probe.sh | 前期 | ffprobe → 归一化 JSON(分辨率/fps/方向/时长/音频/响度) |
prep.sh | 前期 | 重新构图/稳定/背景移除(使用 py3.11 venv) |
package.sh | 后期 | 平台正确容器/宽高比/编解码器/码率编码 |
handoff.sh | 后期 | edl.json → OTIO → edit.fcpxml 用于 DaVinci(需要 ~/.video-director-venv + opentimelineio) |
本文档中显示的调用是说明性的。每个脚本的确切标志/参数顺序
由脚本作者定义,并在集成时确认——在首次使用前
阅读脚本自身的 --help / 头部,而不是信任此处固定的签名。
如果脚本缺失或出错,请运行 doctor.sh,展示结果,并引导用户
查看 install.sh——不要手动内联完成脚本的工作。