出图是"抽一张卡",做视频是"让 100 张卡连成一口气"。这篇不讲模型参数,讲真正卡住人的那一层——叙事单元的切分和帧与帧之间的账。
刚开始做 AI 视频的人,通常会把力气全花在 prompt 上:堆"电影感""8K""大师级运镜"。做完你会发现两件事很扎心:
所以我后来把整件事重构成了流水线:WorkBuddy 当编排层(拆镜 → 下发任务 → 校验 → 合片 → 归档),本地 ComfyUI 当渲染机。这篇就是这条流水线的完整拆解。
把"想清楚"和"跑得动"分成两层,是这套东西能跑起来的前提。混在一起写,你会发现每改一个镜头都要重跑一遍全片。
层 | 谁来做 | 干什么 | 产物 |
|---|---|---|---|
构思层 | WorkBuddy | 读剧本 → 逐镜展开 → 标注叙事目的 → 定时长 → 划段 | 镜头清单 + 段级任务表 |
编排层 | WorkBuddy | 生成首帧、拼 API 工作流、批量提交、轮询、抽帧校验 | 每段一个 webm + 校验记录 |
渲染层 | 本地 ComfyUI | 实际出图 / 出视频 | 原始帧序列 |
收尾层 | WorkBuddy | PyAV 拼接、叠化接缝、响度归一、归档 | 成片 mp4 |
为什么必须分两层:渲染层是"哑"的,它不知道你要讲什么故事,只认 prompt 和帧数;构思层是"哑"的,它不知道显存多大。把判断力放在编排层,渲染层只负责执行——这样换模型、换分辨率、换显卡,上面的东西一行不用改。


这是全套流程里唯一一条没有商量余地的规矩:写任何一条 prompt 之前,先把这张表逐镜填满。表没填满,不许动笔。
格 | 必答内容 | 缺了这一格的真实症状 |
|---|---|---|
① 手的所有权 | 这一镜哪只手做动作;另一只手在哪、手里有什么(写 "free hand" =没写) | 多画一条手臂 / 凭空多一只手 |
② 道具接触关系 | 道具被谁、用哪只手、以什么方式持有;本镜内位置如何变化(含落点) | 道具先消失再凭空出现;道具浮空 |
③ 衣物物理路径 | 凡"移物 / 移衣"动作,必写:物件坐标 → 手与物件接触点 → 逐节中间站点 → 脱离点 | 裙子直接缩上去 / 消失,而不是被撩起、被手指捏住、堆成褶 |
④ 本镜结束状态 | 这一镜结束时:人、手、道具、布料各在哪(=下一镜的起点) | 镜间 / 段间跳变,承接链断裂 |
⑤ 物件动作数 | 本镜与整段的物件动作数(不是子镜数);>3 立刻拆段 | 超载 → 模型在起拍点直接跳到结果,中间过程不存在 |
第 ③ 格是最容易被忽略、也最值钱的一格。举个例子:让角色边走边把手里的布料垂到地上,如果你只写"她把布料放下",模型给你的大概率是布料凭空消失。写成"布料从腰侧滑落 → 指尖勾住布角 → 沿大腿外侧逐节下落 → 触地堆成一褶"之后,动作才会真的被"演"出来。

每段写完必过两条硬自检:
每镜必答两个问题,这叫叙事目的双层标注:
一句话覆盖两层,比如:
镜 3:交代师姐在樱树下抚琴的空间关系(结构层);用中景 + 花瓣缓落让观众先安静下来,为后镜情绪转折蓄力(执行层)。
标完就有四条自检线:找不到目的的镜删掉;连续三镜高强度叙事后必须插一个呼吸镜;伏笔必须成对出现;台词不能成为叙事目的的主体——大量依赖"角色说出 XX"就是视听化不足。
时长则由叙事目的决定(这是 551 个镜头统计出来的基准):
叙事目的 | 基准时长 |
|---|---|
推进 / 升级 | 2.5–3.5s(事件加速,镜头也加速) |
交代 / 建立 / 展现 / 情绪 / 呼应 | 4–5s |
转折 / 翻转 | 5–7s(重量要落地) |
升华 / 主旨 | 6–10s(终极意象需要沉淀) |
对白镜有个反直觉的规矩:先排声音事件,再定镜长,禁止先挑个短镜长再往里塞台词。否则就会出现"台词说到一半被切"的经典翻车。
这是整篇文章最重要的一节。
很多人拿着镜级脚本(4–5 秒一镜、几十镜)直接喂给视频模型,结果成片的突变间隔是 1.7~7.3 秒、而且和你的段边界毫无关系——因为模型在每一段内部会自己切 3~4 次。你排的节奏,它根本没在执行。
正确做法是按"生成单元"重新切,规则就这么几条:
17k+5 网格上(243 帧 ≈ 10.125s / 362 帧 ≈ 15.083s)。4–9 秒的内容向上并进 10s 段——短段反而更容易被跳。超 15s 在叙事闭合点拆段,不许硬压。first_frame。段 N 的首帧姿态 = 段 N−1 的末状态。叠化的做法(一条命令):
# 视频叠化 0.5s + 音频交叉淡化 0.5s,整片复测 0 处突变
ffmpeg -i seg1.mp4 -i seg2.mp4 \
-filter_complex "[0:v][1:v]xfade=transition=fade:duration=0.5:offset=9.6[v]; \
[0:a][1:a]acrossfade=d=0.5[a]" \
-map "[v]" -map "[a]" out.mp4另外,每段开头那 0.3 秒是"首帧交棒"的跳变期,直接裁掉前 8 帧最省事。

试跑路径(别跳):正式推全片之前,先跑 3 段——
视频节点的工作流比出图敏感得多。正确接线只有一种:
{
"1": { "class_type": "LoraLoaderModelOnly",
"inputs": { "model": ["4", 0], "lora_name": "ref2v_turbo.safetensors", "strength_model": 1.0 } },
"2": { "class_type": "MiniMaxH3ImageToVideo",
"inputs": { "model": ["1", 0], "positive": ["5", 0], "first_frame": ["9", 0], "length": 362, "duration": 15 } },
"3": { "class_type": "BasicGuider", "inputs": { "model": ["1", 0], "conditioning": ["2", 0] } },
"6": { "class_type": "KSamplerSelect", "inputs": { "sampler_name": "euler" } },
"7": { "class_type": "BasicScheduler", "inputs": { "model": ["1", 0], "scheduler": "simple", "steps": 8 } },
"8": { "class_type": "CreateVideo", "inputs": { "fps": 24 } }
}三个必须记住的禁用项(出现即花屏):
KSampler —— 换成 BasicGuider + SamplerCustomAdvanced;ConditioningZeroOut —— 没有负向通道,别想着"清空负向";shift_video=12.0 会把 sigma 曲线压平,采样压根不降噪,输出全屏噪声块。花屏速查三步:
这句话值回票价:prompt 不产生细节。"画质细腻""8K""电影感"这类词的权重极低。要脸好,唯一的路是单独出一张"纯脸特写"资产图——脸占画面 70% 以上,不要头肩像。
然后是身份漂移。角色跑到第三段开始变脸,这是所有人的必经之路。三个认知:
"ref_images.ref_image_0": ["11", 0]。写成列表或嵌套字典会被引擎静默丢弃——提交零报错、正常出片、就是人不对。这种坑最耗人。
还有一个反直觉的实测:一段 10 秒里机位一定会自己动。哪怕把"固定机位"写死,它照样偷偷推近,推近幅度与动作幅度正相关——所以想保全景,只能让首帧取景比目标再远一档,别指望 prompt 里的定点句。
分段生成之后,合片这段最容易被小看。用 PyAV 拼接时踩过的坑,按杀伤力排序:
{'safe': '0'},否则报 PermissionError。Invalid argument ... returned 22)。校验成片规格时,必须用便携包自带的解释器:
import av
c = av.open(path)
s = c.streams.video[0]
print(s.codec_context.width, s.codec_context.height, c.duration / 1e6, s.average_rate)
print([(a.codec_context.name, a.codec_context.sample_rate) for a in c.streams.audio])小显存做视频不是"慢一点",是"直接不出片"。几条自己撞出来的红线:
--disable-smart-memory。摘掉这个参数,显存调度会把 20GB 的模型硬塞进 8GB,输出纯色块垃圾;17k+5 网格、15 秒封顶;宽高必须都是 32 的整数倍。反例 768×432 会直接崩——432/32 = 13.5,RoPE reshape 失败,这不是显存问题,是维度对不上;以短边为基准,124 帧 ≈ 5.17 秒,8 步 turbo:
档位 | 像素 | 124 帧耗时 | 用途 |
|---|---|---|---|
| 0.147 MP | ~81–88 s | 草稿:验动作与音轨,成本可忽略 |
| 0.399 MP | ~254 s | 横构图 / 多人场景,不裁人 |
| 0.459 MP | ~326 s | 定稿常用档 |
| 1.032 MP | ~985 s | 上限档,先想清楚再跑 |
选档先算主角横向跨度:要求 档位宽/档位高 × 源高 ≥ 跨度,装不下就一定切人。而且分辨率抬档的时间开销比像素量更陡。
工作流的节奏建议是:先跑草稿档看动作与节奏,满意了再上定稿档。别一上来就冲高分辨率——一个动作超载的段落,跑得再清晰也是废片。
前面十节听着像"视频技术笔记",但真正让这套东西能一天跑完一整章的,是编排层:
一句话总结分工:模型负责"把这一帧画对",WorkBuddy 负责"保证这十几段连起来是一部片"。
症状 | 根因 | 解法 |
|---|---|---|
满屏噪点色块 | 接了 sigma shift 或标准采样器 | 改 |
衣服"飞走"、动作瞬间完成 | 单段物件动作数 >3 | 拆段,每段 ≤3 个动作,逐条补四段式路径链 |
第三段开始换脸 | 参考图没进去 / 只靠 prompt 描述 | 用点号展平键传参考图;走 R2V 通路 |
段与段之间"跳一下" | 首帧重绘与人眼锚定帧有差 |
|
成片没声音 | 音频包写在视频包之后被丢弃 | 按 dts 归并排序后交错 mux |
尾部几十帧丢失 | B 帧没 flush | 编码循环后 |
提交就崩 / 整机蓝屏 | 内存空闲 < 5GB | 提交前探活,空闲 > 10GB 再跑 |
人物被拉伸变形 | 首帧图宽高比 ≠ 目标分辨率 | 喂图前先 center-crop 到目标比例 |
做视频最贵的东西不是显卡,是返工。而返工几乎全部来自两个地方:想清楚之前就动手,以及接缝没处理。
把构思层做成一张必须填满的表、把段级切分当成硬约束、把接缝当成一等公民——这三条做到,你会发现"AI 视频"从碰运气变成了一件可交付的活。
至于工具链,我现在的原则很简单:能本地的绝不上云。渲染在自己机器上跑,编排交给 WorkBuddy,一章节的成本是零积分加一个晚上,比什么都划算。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。