用途 ai-video-handoff 是一个 Blender 技能,用于在“Blender 负责精确部分、AI 负责绘制与运动”的工作流中完成交接。Blender 渲染主体、相机、构图和光照;AI 工具生成背景绘制与运动。该技能只渲染文件并写出清单,然后停止,不会上传、提交或为任何服务付费;AI 步骤由 Seam 或 ComfyUI 通过它们自己的 MCP 工具或技能执行。
主要能力 根据目标输出不同内容。目标为 seam 时,每个运动镜头输出一个 mp4 片段,每个静止镜头输出一张不透明 PNG,并写出 seam/seam_sequence.json。目标为 comfy 时,输出 comfy/assets/<shot>/{beauty,mask,depth}.png 和 comfy/handoff.json。目标为 both(默认)时输出以上全部。
镜头来源优先取显式 shots,其次取 scene["film_shots"](由 film-production 技能写入,含 id、start、end、camera、lens_mm、motion、beat、description),否则从当前帧的活动相机取一张静帧。尺寸会吸附到 32 的倍数(256-2048),默认取自场景;所有镜头使用同一尺寸以保持宽高比一致,吸附情况见 result["warnings"]。Seam 运动镜头按镜头帧范围渲染 H.264 片段,超过 6 秒会被截断为前若干帧并给出警告,不足 1 秒会报错,需先标记为静止或延长。静止镜头渲染中间帧为不透明 RGB PNG。遮罩只渲染指定对象及其子对象,在透明胶片上,忽略遮挡物和地面,名称不存在会在渲染前报错。深度为 16 位 PNG、Non-Color,在 mist 起点至起点+depth 之间线性归一化,非度量值,清单记录每镜头的 {start, depth, falloff, polarity},默认极性为 near=black。脚本触碰的所有设置在 finally 中恢复,result["restored"] 仅在恢复步骤本身失败时为 false。
使用方式 通过 runpy 调用脚本: import runpy result = runpy.run_path("<skill_dir>/scripts/render_handoff.py", init_globals={"ARGS": { "out_dir": "<project>/handoff", "target": "seam", "size": [1280, 704]}})["result"]
import runpy result = runpy.run_path("<skill_dir>/scripts/render_handoff.py", init_globals={"ARGS": { "out_dir": "<project>/handoff", "target": "comfy", "subject": ["Hero"], "passes": ["beauty", "mask", "depth"]}})["result"]
路径使用正斜杠;完整参数见 scripts/render_handoff.py 头部注释。无头 Blender 使用 --args-file <path.json> 代替内联 JSON。脚本需要 Blender 5.2+。有窗口打开时(UI 或 MCP 会话),脚本会在渲染期间把被渲染场景设为窗口场景(透明胶片需要),随后切回;无头运行无需额外操作。
Seam 提交流程:任何付费或云端渲染前先征得同意,并说明将渲染的条数(每段一条)。通过 Seam 的 MCP 服务器调用 list_presets,预设只在其列出的长度上有效。读取 seam/seam_sequence.json,按 list_presets 为每个段设置 preset 和 seconds;脚本写入 preset: null 占位,从不自行编造,可按需添加 seed、prompt_extra、a_desc、b_desc。以清单中的 shots(本地路径,按顺序)和编辑后的 segments(数量必须等于 len(shots) - 1)调用 create_sequence,然后 wait_sequence 和 preview_sequence。也可走 REST:用 POST /api/uploads 以 role=mid 上传每个文件,再根据返回的 id 自行构造序列请求体,详见 references/seam.md。Seam 会按第一个镜头的宽高比渲染所有片段并自行决定像素尺寸,清单只记录 Blender 使用的尺寸,不要向用户承诺输出分辨率。
ComfyUI 提交流程:使用 comfy CLI 及其技能(comfy、comfy-director、comfy-relay),不要在此重实现。在工作目录执行 comfy project init(或使用现有项目),将 comfy/assets/<shot>/ 复制到项目的 assets/ 下并保留镜头子目录,执行 comfy assets push,然后在蓝图中以 $asset.<shot>/beauty.png、$asset.<shot>/mask.png、$asset.<shot>/depth.png 引用。任何伙伴 API 或云端运行前先询问用户,因为会消耗其 Comfy 额度(comfy 需要 --allow-spend);免费本地运行无需同意标志。用 comfy download 取回结果并展示帧画面而非路径。
推荐配方:在 Blender 锁定镜头(相机、镜头、构图、光照在 AI 运行前定稿,之后绝不再移动相机);以 target: "comfy"、subject: [...] 渲染主体通道得到 beauty、遮罩(白色=主体)和深度图;在 ComfyUI 中用深度 ControlNet 或反相遮罩的 inpaint 节点生成背景,模型要求近处为白时可设 depth_near_white: true;用遮罩将 Blender 主体合成到生成背景上(ComfyUI 合成节点或 Blender 合成器),主体保持与 Blender 渲染逐像素一致;再把合成帧作为镜头交给 Seam(用于镜头间过渡),或在 ComfyUI 中以合成为首帧运行图生视频流程;最后检查帧画面,查看联系表或每个结果的首/中/末帧后再报告成功,并说明检查了哪些内容。
适用场景 需要在 AI 步骤中使用主体遮罩、深度或自建图生视频图时用 ComfyUI;需要镜头之间的过渡时用 Seam。Seam 只接受 2-8 张静帧或 1-6 秒片段,会忽略深度、alpha 和相机数据,自行选择输出尺寸。其他带 alpha、遮罩、深度、相机数据、3D 文件或超过 8 个/少于 2 个镜头、片段超出 1-6 秒、指定输出尺寸、使用 list_presets 未列出的预设或长度的情况,Seam 都无法处理,改用 ComfyUI。
限制与检查 脚本只在 Blender 侧渲染并写清单,不执行 AI 步骤。报告完成前应打开一个镜头的 beauty、mask、depth 确认遮罩仅覆盖主体;确认 seam_sequence.json 的镜头按故事顺序且段数为 len(shots) - 1;并说明已提交内容、仍未提交内容,以及若 AI 步骤尚未渲染则明确说明。