欢迎回到 AI 短剧系列。前几篇我们完成了 ComfyUI 的安装、基础工作流、角色一致性控制,以及 AnimateDiff 视频生成实战。今天我们要解决一个短剧创作中至关重要的问题:如何把多个镜头串成一段有叙事感的完整片段。单个 2~4 秒的镜头只是素材,真正的短剧需要镜头之间的切换、景别变化与节奏控制。本篇将带你搭建一套「关键帧 + 分镜」驱动的多镜头序列工作流,让你用 ComfyUI 就能产出一段可剪辑的分镜素材。

为什么短剧需要关键帧与分镜
短剧的核心是「信息密度」与「情绪节奏」。一个 60 秒的短剧片段,通常由 8~15 个镜头组成,每个镜头承担不同的叙事功能:交代环境(远景)、展示人物动作(中景)、强调表情(特写)。如果只靠单一提示词一次性生成长视频,角色动作会失控、场景会漂移、风格会崩塌。
关键帧(Keyframe)的本质,是在时间轴上「钉住」某些必须保持稳定的画面——比如人物开场时的站位、转身后的朝向、镜头的起始构图。分镜(Storyboard)则把这些关键帧按叙事顺序排列,形成一条可复用的生产流水线。掌握了这两者,你就能从「碰运气出片」进阶到「按计划生产」。
核心概念:关键帧在 ComfyUI 中的三种形态
在 ComfyUI 生态里,关键帧通常通过以下三种方式落地,理解它们的区别是搭工作流的前提:
- 图像关键帧(Image Keyframe):用一张确定构图的参考图,作为 AnimateDiff 或视频节点的首帧,锁定镜头起点。
- 提示词关键帧(Prompt Keyframe):在时间轴的不同区间切换提示词,实现「镜头 A 推镜头 B」的语义变化。
- 控制网关键帧(ControlNet Keyframe):用深度图、边缘图、姿态图等控制信号,约束每一帧的结构不跑偏。
下面我们用一个完整的多镜头工作流,把这三种关键帧组合起来。
实战步骤:搭建多镜头序列工作流
第一步:准备分镜脚本 JSON
先用 JSON 描述你的分镜,包括镜头编号、持续时间、提示词、起始关键帧图像路径。这样后续节点可以批量读取:
{
"shots": [
{
"id": 1,
"duration_frames": 32,
"prompt": "远景,城市夜晚街头,女主撑伞站立,霓虹灯倒影,电影感",
"keyframe_image": "keyframes/shot01_start.png"
},
{
"id": 2,
"duration_frames": 24,
"prompt": "中景,女主转身回眸,雨滴滑落,浅景深",
"keyframe_image": "keyframes/shot02_start.png"
},
{
"id": 3,
"duration_frames": 16,
"prompt": "特写,女主眼神坚定,湿发贴在脸颊,情绪张力",
"keyframe_image": "keyframes/shot03_start.png"
}
]
}
第二步:加载 AnimateDiff 运动模块
视频生成的核心是 AnimateDiff 运动模块(Motion Module)。在 ComfyUI 中加载它,并设置帧数与帧率:
# ComfyUI 节点配置示意(AnimateDiff Loader)
motion_module = "mm_sd_v15_v2.ckpt"
frames = 32 # 单镜头帧数
fps = 8 # 每秒帧数,短剧常用 8~12
# 输出一个 4 秒的镜头(32 / 8 = 4 秒)
第三步:用批量提示词节点切换镜头语义
使用 Batch Prompt Schedule(批量提示词调度)节点,让不同镜头区间的提示词自动切换。时间轴按帧数切分:
# Batch Prompt Schedule 配置
prompt_schedule:
- frame: "0"
text: "远景,城市夜晚街头,女主撑伞站立,霓虹灯倒影,电影感"
- frame: "32"
text: "中景,女主转身回眸,雨滴滑落,浅景深"
- frame: "56"
text: "特写,女主眼神坚定,湿发贴在脸颊,情绪张力"
第四步:用 Load Image 批量挂载关键帧首图
每个镜头的第一帧,用 Load Image (Batch) 或 Load Image List from Dir 节点挂载对应的关键帧图像,锁定镜头起点构图:
# Load Image List from Dir 节点配置
input_directory = "keyframes/"
pattern = "shot*.png"
# 节点会按文件名顺序输出图像批次,作为 AnimateDiff 的 latent 初始化
第五步:串联 ControlNet 保持结构稳定
为避免长镜头中人物结构崩坏,接入 ControlNet,用深度图或姿态图约束每一帧。以深度控制为例:
# ControlNet Apply 节点配置
control_net_model = "control_v11f1p_sd15_depth.pth"
strength = 0.85 # 控制强度,越高结构越稳定
start_percent = 0.0 # 从第 0 帧开始控制
end_percent = 1.0 # 控制到最后一帧
把以上五步按顺序连线:分镜 JSON → Load Image → ControlNet → AnimateDiff → KSampler → VAE Decode → Save Video,就得到一段三镜头连续输出的素材。
常见问题
Q:镜头切换时画面会「跳」怎么办?
关键帧之间的过渡需要给足 overlap(重叠帧)。在 AnimateDiff 或视频插值节点中设置 2~4 帧的重叠,让上一个镜头的尾帧与下一个镜头的首帧自然融合。若仍跳变,检查两个镜头的 ControlNet 强度是否一致。
Q:批量提示词切换时角色外观漂移了?
提示词本身不承载角色外观。务必配合上一篇讲的 LoRA 与参考图(IPAdapter/ControlNet)锁定角色一致性,提示词只负责景别、动作与情绪。
Q:为什么生成的视频时长对不上?
视频时长 = 帧数 / fps。先确定目标时长,再反推帧数。短剧镜头一般 2~4 秒,fps 取 8 时对应 16~32 帧。帧数太大容易崩,帧数太小没动作。
Q:批量挂载关键帧后第一帧颜色发灰?
检查 Load Image 输出的图像是否经过了正确的 VAE 编码,以及 ControlNet 预处理是否匹配模型类型(深度图用 depth,姿态用 openpose)。预处理不匹配会导致控制信号错误。
总结
今天我们把 ComfyUI 的「单镜头生成」升级到了「多镜头序列生产」:用 JSON 定义分镜、用批量提示词调度切换语义、用 Load Image 挂载关键帧首图、用 ControlNet 锁定结构稳定。这套工作流是你从「做一段动图」迈向「做一条短片」的关键一步。下一阶段,我们将进入 ComfyUI 的高级技巧——自定义节点、批处理与性能优化,让这条流水线跑得更快、更省显存。
下期预告:第 11 天《ComfyUI 高级技巧——自定义节点、批处理与性能优化》,教你用自定义节点扩展能力、用批处理解放双手、用显存优化把单卡跑出多卡效率,敬请期待。
















暂无评论内容