在前几天的内容里,我们已经把 ComfyUI 的安装、界面、文生图、图生图、ControlNet、参考图与 LoRA 这些静态画面层面的能力过了一遍。但从「能出图」到「能出短剧」,中间还差最关键的一步:让画面动起来。今天这一篇,我们就正式进入 ComfyUI 的视频生成环节,围绕 AnimateDiff 这条最成熟的开源视频技术路线,把「文生视频」「图生视频」两类核心工作流彻底讲透,并给出可以直接跑通的实战案例。

一、核心概念:ComfyUI 是怎么「动」起来的
要理解 AnimateDiff,先要理解一个基本事实:当前主流的开源视频扩散模型,本质上仍然是在「多帧图像」上做文章,而不是像传统视频那样逐帧渲染。AnimateDiff 的思路非常巧妙——它在 Stable Diffusion 的 UNet 里注入一个可训练的「运动模块(Motion Module)」,让模型学会把连续的多帧当作一个整体来去噪,从而在保持单帧画质的同时,让相邻帧之间产生连贯的运动。
对短剧创作者来说,这带来一个直接的好处:你原本写好的文生图提示词、训练好的角色 LoRA、甚至是 ControlNet 控制,基本都可以无缝迁移到视频生成里。换句话说,AnimateDiff 不是另起炉灶,而是给已有的图像工作流「加了一个时间维度」。
下面这个表帮你快速建立概念对照:
| 概念 | 静态图像 | AnimateDiff 视频 |
|---|---|---|
| 输出 | 1 张图 | N 帧连续画面 |
| 提示词 | 描述单帧内容 | 描述主体 + 运动方向 |
| LoRA | 角色/画风一致 | 角色/画风 + 运动风格 |
| ControlNet | 控制构图 | 控制姿态 + 运动轨迹 |
| 核心模块 | UNet | UNet + Motion Module |
二、环境准备:装好 AnimateDiff 相关节点
ComfyUI 的视频能力主要靠第三方自定义节点扩展。推荐优先安装 ComfyUI-AnimateDiff-Evolved,它把运动模块加载、采样配置、上下文调度等功能封装得非常完整,是目前社区维护最活跃的方案之一。安装方式如下:
cd /home/user/ComfyUI/custom_nodes
git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved.git
cd ComfyUI-AnimateDiff-Evolved
pip install -r requirements.txt
模型文件同样要放到指定目录。运动模块(Motion Module)是 AnimateDiff 的灵魂,常见的版本有 v2、v3 以及针对 SDXL 的 mm_sdxl_v10_beta。把 .safetensors 文件放到 custom_nodes 对应目录即可:
# 假设你已经下载了运动模块,例如 mm_sd15_v3.safetensors
mkdir -p /home/user/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models
mv mm_sd15_v3.safetensors /home/user/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models/
如果你还想尝试图生视频(SVD,即 Stable Video Diffusion),则需要额外安装 ComfyUI-VideoHelperSuite 来处理视频的加载、保存和帧抽取:
cd /home/user/ComfyUI/custom_nodes
git clone https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite.git
cd ComfyUI-VideoHelperSuite
pip install -r requirements.txt
安装完成后重启 ComfyUI。如果你的模型较大,建议显存至少 8GB 起步,16GB 以上体验会流畅很多。
三、实战步骤:搭建你的第一个 AnimateDiff 文生视频工作流
下面是一个最小可用的 AnimateDiff 文生视频工作流结构。我们把节点分成五组来理解:
- 模型加载组:CheckpointLoaderSimple 加载底模,Load AnimateDiff Model 加载运动模块。
- 提示词组:CLIPTextEncode 分别处理正向、负向提示词。
- 采样组:KSampler 负责去噪,但这里的「采样」是针对多帧潜在空间。
- 运动调度组:AnimateDiff Loader 把运动模块、帧数、帧率、运动强度组装起来。
- 解码输出组:VAEDecode 解码潜在空间,VideoHelperSuite 负责合成视频。
下面给出一个可以直接导入的 workflow JSON 片段(节选核心节点配置,方便你理解参数含义):
{
"nodes": [
{
"id": 1,
"type": "CheckpointLoaderSimple",
"inputs": { "ckpt_name": "sd_xl_base_1.0.safetensors" }
},
{
"id": 2,
"type": "ADE_AnimateDiffLoaderWithContext",
"inputs": {
"model_name": "mm_sdxl_v10_beta.safetensors",
"beta_schedule": "sqrt_linear",
"context_length": 16,
"motion_scale": 1.0
}
},
{
"id": 3,
"type": "KSampler",
"inputs": {
"steps": 25,
"cfg": 7.0,
"denoise": 1.0,
"batch_size": 16
}
}
]
}
这里有几个关键参数需要重点说明:
- context_length(上下文长度):决定模型一次看多少帧来推断运动,16 帧是常用默认值,越大越连贯但也越吃显存。
- motion_scale(运动强度):控制画面运动的幅度,短视频建议 0.8~1.2,太小画面接近静止,太大容易抖动变形。
- batch_size:这里等同于「帧数」,一次生成多少帧。短剧片段常用 16 帧起步。
提示词怎么写的讲究
视频提示词和图像提示词最大的区别,在于你必须把「运动」写出来。只写一个静态主体,模型就不知道它该怎么动。对比一下:
# 差:缺少运动描述
a woman standing on a street, cinematic lighting
# 好:明确主体 + 动作 + 镜头语言
a woman slowly walking forward on a rainy street, cinematic lighting,
camera slowly tracking backwards, shallow depth of field, 4k
常用运动词可以多积累:slowly walking、turning head、camera pan、dolly zoom、hand waving、leaves falling、car driving。镜头语言词(camera tracking、pan、zoom、tilt)对短剧的镜头感提升非常明显。
四、实战步骤:图生视频,让静态角色动起来
对于短剧来说,图生视频往往比文生视频更实用——因为你大概率已经用 LoRA 固定好了主角形象。AnimateDiff 支持「输入首帧,让模型往后续写运动」的方式,也就是常见的「首帧引导」图生视频。
核心思路是:用 LoadImage 加载你选好的角色静态图,通过 VAEEncode 转成潜在空间,作为采样的初始帧,再配合 AnimateDiff 让后续帧自然延续。下面是一个图生视频工作流的关键配置:
# 伪代码演示图生视频的帧引导逻辑(实际在 ComfyUI 节点中完成)
init_image = load_image("hero_frame_001.png")
init_latent = vae_encode(init_image) # 首帧转潜在空间
latent_batch = animate_diff_expand(init_latent, total_frames=16)
video_latent = ksampler(denoise=0.7, latent_batch)
video_frames = vae_decode(video_latent)
save_video(video_frames, fps=8)
注意这里 denoise 参数很关键:太低(如 0.4)首帧还原度高但后续帧运动不足,太高(如 0.9)运动会更丰富但首帧角色容易崩。建议从 0.65~0.75 区间开始调,配合 ControlNet 的 OpenPose 姿态控制,可以让角色动作更符合剧本要求。
五、常见问题(FAQ)
Q1:生成的视频一闪一闪的,怎么解决?
这是 AnimateDiff 最常见的「帧间闪烁」问题。可以从三方面处理:提高 context_length(如 16 提到 32)、适当降低 motion_scale、开启运动模块的 freeze 或使用更稳定的 beta_schedule(如 linear 换成 sqrt_linear)。
Q2:显存不够,16 帧都跑不动怎么办?
优先减小帧数(8 帧起步)、降低分辨率(512×512)、关闭不必要的 ControlNet,或者开启 --lowvram 启动参数。批量处理时务必勾选「清空缓存」,避免显存泄漏导致越跑越慢。
Q3:角色脸部模糊、崩坏怎么处理?
视频生成对角色一致性的要求比静态图更高。建议同时叠加角色 LoRA 和 IPAdapter 参考图,把脸部特征「锁」住;必要时降低运动强度,优先保证脸部稳定。
Q4:AnimateDiff 和 SVD 该怎么选?
AnimateDiff 擅长文生视频、运动可控、社区资源多,适合有明确运动要求的镜头;SVD(Stable Video Diffusion)擅长图生视频、画质细腻,但运动方向不可控、帧数固定。短剧实战中通常 AnimateDiff 打主力,SVD 补空镜。
六、总结
今天我们把 ComfyUI 从「静态图像」推进到了「动态视频」:理解了 AnimateDiff 通过 Motion Module 给扩散模型注入时间维度的原理,学会了安装 AnimateDiff-Evolved 和 VideoHelperSuite 两类关键节点,并完整跑通了文生视频与图生视频两条工作流,掌握了 context_length、motion_scale、denoise 这几个决定成片质量的灵魂参数。
到这里,ComfyUI 的「单镜头动态画面」能力你已经具备了。下一篇我们要解决一个更贴近短剧实战的问题:一个短剧不可能只有一个镜头,如何把多个镜头串成一段有叙事逻辑的片段?关键帧与分镜工作流的搭建,就在下一篇。
下期预告:第 10 天「ComfyUI 关键帧与分镜——多镜头序列工作流搭建」,教你用关键帧控制镜头切换,把零散镜头拼成真正的短剧片段,敬请期待。
















暂无评论内容