在实际 AI 视频生成领域,Stable Diffusion 的 WebUI 因其直观的界面而广为人知,但当项目需要更复杂的流程编排、更精细的节点化控制,或者希望将视频生成过程自动化、批量化时,ComfyUI 便成为了更专业的选择。ComfyUI 将 AI 图像与视频生成的每一个步骤——从模型加载、提示词解析、采样器设置到图像后处理——都抽象为可连接、可复用的节点,通过可视化的工作流(Workflow)进行串联。这种设计理念不仅让整个生成过程变得透明可控,也为实现文生视频、图生视频乃至更复杂的 AI 短剧、漫剧制作提供了强大的底层支持。
本文面向已经了解 Stable Diffusion 基础概念,希望从零开始掌握 ComfyUI,并最终能独立搭建 AI 视频生成工作流的开发者与创作者。我们将彻底抛开图形界面的简单操作,深入到工作流搭建的底层逻辑中。你将学习到如何从一张白布开始,逐步连接节点,构建出能够稳定生成视频片段的工作流,理解每个核心节点的作用与参数配置,并掌握排查常见错误的方法。最终,你将具备搭建自定义工作流的能力,无论是简单的文生视频、图生视频,还是涉及镜头控制、首尾帧衔接的复杂叙事性视频。
1. 理解 ComfyUI 的核心:节点与工作流
在开始动手搭建之前,必须建立对 ComfyUI 核心机制的正确认知。这不同于点击按钮的生成方式,而是一种编程思维的可视化体现。
1.1 什么是节点(Node)?
节点是 ComfyUI 中最基本的执行单元。每一个节点都代表一个特定的、原子级的操作或功能。例如:
- 加载模型节点:负责从硬盘读取 Stable Diffusion 模型文件(
.safetensors或.ckpt)到显存。 - CLIP 文本编码器节点:将你输入的自然语言提示词(Prompt)转换为模型能够理解的数学向量(Embeddings)。
- KSampler 采样器节点:执行去噪过程,根据提示词和随机种子(Seed)生成潜在空间中的图像数据。
- VAE 解码器节点:将采样器生成的潜在空间数据解码为最终的 RGB 像素图像。
每个节点都有输入槽(左侧)和输出槽(右侧)。输入槽接收数据,节点内部进行处理,然后将结果从输出槽传递给下一个节点。数据流沿着连接线(从输出槽拖拽到输入槽)在工作流中传递。
1.2 什么是工作流(Workflow)?
工作流就是由多个节点通过有向连接线组合而成的完整执行图谱。它定义了 AI 生成任务的完整流水线。一个典型的文生图工作流可能遵循这样的路径:加载模型->编码提示词->设置采样参数->执行采样->解码图像->保存输出。
工作流的核心优势在于其可复用性与可维护性。你可以将一套成熟的、参数调优好的视频生成流程保存为一个.json或.png文件。下次需要时,直接加载这个文件,所有节点、连接和参数都会恢复,无需重新搭建。这对于需要固定风格或复杂流程的 AI 短剧、广告视频批量生产至关重要。
1.3 ComfyUI 与 Automatic1111 WebUI 的关键差异
理解差异能帮助你明确学习 ComfyUI 的价值。
| 特性维度 | ComfyUI | Automatic1111 WebUI |
|---|---|---|
| 交互模式 | 节点编程式,可视化连接数据流。 | 表单填写式,在固定界面中调整参数。 |
| 灵活性 | 极高。可以任意组合节点,创建复杂、非标准的流程(如多模型融合、自定义后处理链)。 | 中等。功能受限于官方提供的标签页和插件,难以自定义执行顺序。 |
| 透明度 | 完全透明。每个步骤的输入输出清晰可见,便于调试和理解原理。 | 黑盒。用户通常只关心最终输出,中间过程不可见。 |
| 资源占用 | 更高效。按需加载节点,工作流稳定后,可以精确控制内存和显存的使用。 | 相对较高。界面元素和固定模块较多,可能包含不必要的开销。 |
| 自动化与API | 原生友好。工作流本身就是一张可序列化的执行图,极易通过代码(如 Python)进行调用、参数替换和批量执行。 | 需要依赖额外的插件或 API 扩展。 |
| 学习曲线 | 较陡峭。需要理解节点功能和数据流。 | 平缓。对新手友好,上手即用。 |
对于 AI 视频生成这类多步骤、多条件控制的复杂任务,ComfyUI 的节点化优势会体现得淋漓尽致。你可以轻松地将“文本生成首帧”、“首帧驱动生成后续帧”、“帧间插值平滑”、“添加音频”等环节串联成一个自动化流水线。
2. 环境准备与 ComfyUI 部署
在搭建工作流之前,需要一个稳定可用的 ComfyUI 运行环境。这里我们以在 Windows 系统上使用“秋叶一键整合包”为例,因为它集成了 Python、PyTorch、CUDA 等复杂依赖,极大降低了部署门槛。
2.1 系统与硬件要求
- 操作系统:Windows 10/11 64位,或 Linux/macOS。
- 显卡:NVIDIA GPU,显存建议8GB 及以上。4GB 显存可运行基础文生图,但进行视频生成(尤其是涉及多帧、高分辨率)时会非常吃力,极易出现“显存不足(Out of Memory)”错误。AMD GPU 可通过 ROCm 支持,但配置更复杂。
- 内存:16GB RAM 或以上。
- 硬盘空间:至少 20GB 可用空间,用于存放 ComfyUI 本体、基础模型和依赖。
2.2 使用秋叶一键整合包安装
- 获取整合包:从可靠的来源(如秋叶的 B站 或 GitHub 发布页)下载最新的 ComfyUI 整合包。通常是一个压缩文件(如
comfyui_windows_portable_nvidia_vX.X.X.7z)。 - 解压:将压缩包解压到一个英文路径的文件夹中,例如
D:\AI_Tools\ComfyUI。路径中不要包含中文或特殊字符,这是避免许多未知错误的通用准则。 - 启动:进入解压后的文件夹,双击运行
run_nvidia_gpu.bat(针对 NVIDIA GPU)。首次运行会自动下载和配置 Python 环境及必要依赖,时间可能较长。 - 访问界面:当命令行窗口出现类似
“Running on local URL: http://127.0.0.1:8188”的信息时,打开浏览器,访问http://127.0.0.1:8188,即可看到 ComfyUI 的空白工作区。
注意:如果启动后浏览器无法访问,请检查防火墙设置,或确认端口 8188 未被其他程序占用。可以修改
extra_model_paths.yaml示例文件来配置自定义模型路径,但新手建议先使用整合包默认路径。
2.3 安装缺失节点与插件
ComfyUI 的强大生态依赖于社区插件。首次加载他人分享的工作流(.json或.png)时,常会遇到红色节点并提示“Missing Nodes”(节点缺失)。
- 识别缺失节点:将工作流文件拖入 ComfyUI 浏览器窗口,红色高亮的节点即为缺失节点。鼠标悬停可看到节点类型名(如
“ComfyUI-Impact-Pack”)。 - 通过管理器安装(推荐):
- 点击工作区右侧的“管理器(Manager)”按钮(或通过菜单打开)。
- 切换到“安装节点(Install Node)”标签页。
- 在搜索框中输入缺失节点的名称(如
Impact Pack)进行搜索。 - 找到后点击“安装(Install)”。安装完成后,需要完全重启 ComfyUI(关闭命令行窗口再重新启动
run_nvidia_gpu.bat)。
- 手动安装(备选):如果管理器找不到,通常需要去 GitHub 找到该插件的仓库。按照其
README.md说明,将插件克隆或下载到 ComfyUI 目录下的custom_nodes文件夹内,然后重启 ComfyUI。
一个功能完整的 AI 视频工作流通常需要以下插件,建议提前通过管理器安装:
- ComfyUI-VideoHelperSuite:视频生成核心插件,提供加载视频、拆分帧、合成视频等节点。
- ComfyUI-Impact-Pack:功能强大的工具集,包含许多实用节点,如通配符处理、图像预处理等。
- AnimateDiff:实现图生视频、文生视频动态生成的核心动画插件。
3. 构建你的第一个 AI 视频工作流:图生视频
我们从相对直观的“图生视频”开始。其核心思想是:给定一张初始图片,利用 AI 模型生成与之连贯的后续帧,从而形成一段动态视频。这里使用 AnimateDiff 插件。
3.1 工作流整体框架与节点布局
首先,清空工作区。我们将从左到右、从上到下搭建一个逻辑清晰的工作流。主要分为以下几个功能区:
- 模型加载区(左上):加载基础模型、VAE、LoRA 等。
- 提示词与参数区(左中):输入正面/负面提示词,设置采样参数。
- 图像输入与预处理区(左下):加载初始图片并为其编码。
- 动画生成核心区(中部):放置 AnimateDiff 相关运动模块和采样器。
- 视频合成输出区(右侧):解码图像序列并合成视频。
3.2 逐步搭建节点
步骤一:加载模型与提示词编码
- 右键工作区 ->
“loaders”->“Checkpoint Loader Simple”。这个节点用于加载你的大模型(如realisticVisionV51_v51VAE.safetensors)。将其放在左上角。 - 右键 ->
“conditioning”->“CLIP Text Encode (Prompt)”,创建两个。一个用于正面提示词(Positive),一个用于负面提示词(Negative)。将它们放在模型加载节点右侧。 - 将
Checkpoint Loader Simple节点的CLIP输出连接到两个CLIP Text Encode节点的clip输入。 - 将
Checkpoint Loader Simple节点的VAE输出暂时留空,后续会用到。 - 在两个
CLIP Text Encode节点的text输入框中,分别填写你的正面和负面提示词。例如,正面:“masterpiece, best quality, a beautiful landscape, cinematic lighting”;负面:“worst quality, low quality, blurry”。
步骤二:加载与处理初始图像
- 右键 ->
“image”->“Load Image”。节点用于加载你的初始图片。将其放在左下角。 - 右键 ->
“latent”->“VAE Encode (for inpainting)”。注意,这里使用VAE Encode节点,目的是将像素图像编码为模型所需的潜在空间(Latent)表示。将其放在图片加载节点右侧。 - 将
Load Image节点的IMAGE输出连接到VAE Encode节点的pixels输入。 - 将第一步中
Checkpoint Loader Simple节点的VAE输出连接到VAE Encode节点的vae输入。 - 此时,
VAE Encode节点输出的LATENT就是你的初始图像在潜在空间中的表示。
步骤三:配置 AnimateDiff 运动模块
- 右键 ->
“AnimateDiff”->“AnimateDiffLoader”(或类似名称,取决于插件版本)。这个节点用于加载运动模型(Motion Module),如mm_sd_v15_v2.ckpt。将其放在中部。 - 在
AnimateDiffLoader节点中,设置batch_size。这决定了视频的总帧数。例如,设置为 16,意味着将生成 16 帧的潜在图像序列。 - 右键 ->
“AnimateDiff”->“ADE_AnimateDiffUniformContextOptions”(或上下文设置节点)。这个节点控制动画的上下文长度和重叠,影响帧间连贯性。通常可以先用默认值。 - 将
AnimateDiffLoader节点的MOTION_MODULE输出连接到上下文设置节点的对应输入。
步骤四:集成采样器
- 右键 ->
“sampling”->“KSampler Advanced”(高级采样器提供更多控制)。将其放在运动模块右侧。 - 连接节点:
model输入:连接到Checkpoint Loader Simple的MODEL输出。positive输入:连接到正面CLIP Text Encode的CONDITIONING输出。negative输入:连接到负面CLIP Text Encode的CONDITIONING输出。latent_image输入:这是关键!连接到VAE Encode节点输出的LATENT。这告诉采样器以我们提供的初始图像为起点。motion相关输入:连接到ADE_AnimateDiffUniformContextOptions节点的MOTION_MODULE输出(具体端口名可能略有不同)。
- 配置
KSampler Advanced参数:steps:采样步数,影响细节和质量,通常 20-30。cfg:提示词相关性,通常 7-8。sampler_name:采样器,如euler,dpmpp_2m。scheduler:调度器,如normal,karras。denoise:去噪强度。对于图生视频,如果你想保留较多原图信息,可以设置为 0.5-0.7;如果想让 AI 自由发挥更多,可以接近 1.0。
步骤五:解码与保存视频
- 右键 ->
“latent”->“VAE Decode”。将其放在采样器右侧。 - 将
KSampler Advanced的LATENT输出连接到VAE Decode的samples输入。 - 将
Checkpoint Loader Simple的VAE输出连接到VAE Decode的vae输入。 - 右键 ->
“VideoHelperSuite”->“VHS_VideoCombine”。这个节点将解码后的图像序列合成为视频。 - 将
VAE Decode的IMAGE输出连接到VHS_VideoCombine的images输入。 - 在
VHS_VideoCombine节点中设置:frame_rate:帧率,如 8。filename_prefix:输出视频的文件名前缀。format:视频格式,如mp4。
- 最后,右键 ->
“utils”->“SaveImage”(虽然叫 SaveImage,但连接视频节点后可以触发视频保存流程)。将VHS_VideoCombine的某个输出(如video或ui)连接到SaveImage。SaveImage节点通常会自动触发结果保存。
3.3 关键参数详解与初次运行
完成连接后,你的工作流应该是一个从左到右、数据流清晰的可执行图。现在,点击工作区右下角的“Queue Prompt”按钮来执行。
首次运行可能会较慢,因为需要加载模型。在命令行窗口可以观察进度。成功后,生成的视频会保存在 ComfyUI 的output目录下。
核心参数深度解析:
batch_size(在 AnimateDiffLoader 中):这直接等于生成视频的总帧数。帧数 =batch_size。例如,batch_size=16,帧率frame_rate=8,则视频时长 = 16 / 8 = 2 秒。denoise(在 KSampler 中):这是图生视频的“创造力”控制阀。denoise=1.0:完全忽略初始图像,仅根据提示词生成全新的内容序列。结果可能与原图无关。denoise=0.5:强烈尊重初始图像,只在原图基础上进行微小的、连贯的变化。适合制作细微动态效果。- 初始尝试建议设置在
0.65-0.85之间,以平衡连贯性与变化性。
- 运动模型(Motion Module):不同的
.ckpt文件会产生不同的运动风格。v1,v2,v3版本在运动幅度、平滑度上有所区别,需要根据生成内容(人物动作、镜头移动、场景变换)进行选择。
4. 进阶:构建文生视频与首尾帧控制工作流
图生视频是基于给定起点进行推演,而文生视频则是“无中生有”,完全由提示词驱动生成一段动态。首尾帧控制则是更高级的技巧,用于精确控制视频的开始和结束画面。
4.1 纯文生视频工作流改造
将上面的图生视频工作流稍作修改即可:
- 移除图像输入部分:删除
Load Image和VAE Encode节点。 - 修改采样器输入:将
KSampler Advanced的latent_image输入,从连接VAE Encode改为连接一个Empty Latent Image节点。 - 添加
Empty Latent Image节点:右键 ->“latent”->“Empty Latent Image”。此节点用于定义生成图像的尺寸和批次。 - 关键配置:在
Empty Latent Image节点中,batch_size必须与AnimateDiffLoader节点中的batch_size保持一致,因为它决定了潜在噪声批次的数量,每一批噪声会生成一帧。width和height设置视频分辨率。 - 调整
denoise:文生视频时,denoise通常设置为1.0,因为不需要保留任何初始图像信息。
4.2 实现首尾帧控制
首尾帧控制的目标是:让视频的第一帧接近图像 A,最后一帧接近图像 B,中间帧由 AI 平滑过渡。这需要用到“Latent Composite”或“Conditioning Blend”等高级技巧。这里介绍一种基于提示词混合和潜在空间插值的简化思路。
- 准备首尾帧图像:使用两个
Load Image和VAE Encode节点,分别加载并编码首帧和尾帧图像,得到latent_head和latent_tail。 - 创建线性权重序列:我们需要为每一帧生成一个权重值(0到1),首帧权重为0,尾帧权重为1,中间帧平滑过渡。这可以通过
“ImpactPack/Util”中的“Make Basic Pipe”或自定义脚本节点实现,输出一个长度为batch_size的权重列表。 - 潜在空间混合:使用
“Latent”->“Latent Blend”节点(或类似功能的插件节点)。将latent_head、latent_tail和权重序列输入该节点。该节点会根据每一帧的权重,对首尾帧的潜在表示进行线性插值,生成一系列中间潜在状态,作为KSampler的latent_image输入。 - 提示词混合(可选但推荐):同样,可以为首尾帧设置不同的提示词(例如,首帧:“a sunny day”,尾帧:“a rainy night”)。使用
“Conditioning”->“Conditioning Blend”节点,将两组提示词编码(Conditioning)与相同的权重序列进行混合,生成动态变化的提示词条件输入给采样器。 - 连接采样器:将混合后的潜在图像和混合后的提示词条件,分别接入
KSampler Advanced的latent_image、positive和negative输入。
这种方法的原理是,为采样器提供一系列从起点到终点的“引导”,而不仅仅是单一起点。AnimateDiff 的运动模块会在这些引导之间生成合理的动态过渡。
5. 工作流优化、排错与生产实践
搭建工作流只是第一步,让它稳定、高效、符合预期地运行,需要掌握优化和排错技巧。
5.1 常见错误与排查清单
| 问题现象 | 可能原因 | 检查与解决步骤 |
|---|---|---|
| 节点飘红,提示“Missing Nodes” | 缺少对应插件。 | 1. 确认节点名称。2. 通过管理器搜索安装。3. 重启 ComfyUI。 |
| 运行时报错,提示属性错误或类型不匹配 | 节点连接错误,数据类型不匹配。 | 1. 检查连线:MODEL输出应连MODEL输入,LATENT连LATENT,IMAGE连IMAGE。2. 鼠标悬停端口查看类型提示。3. 断开错误连线重新连接。 |
| 生成结果全黑、全灰或扭曲 | VAE 未正确连接或冲突;模型不匹配。 | 1. 确保VAE Decode节点的vae输入连接到了模型加载器的VAE输出。2. 有些模型内置 VAE,有些需要外挂,确认模型要求。3. 尝试切换不同的 VAE 文件。 |
| 视频闪烁、抖动剧烈 | 帧间一致性差。 | 1. 降低denoise值。2. 调整 AnimateDiff 上下文参数(如增加context_length)。3. 尝试不同的运动模型(Motion Module)。4. 在提示词中加入增强一致性的词汇,如 “consistent scene, smooth transition”。 |
| 显存不足(CUDA out of memory) | 分辨率过高、帧数太多、同时加载多个大模型。 | 1. 降低width和height(如 512x512)。2. 减少batch_size(总帧数)。3. 使用--lowvram参数启动 ComfyUI。4. 清理工作流,确保没有未使用的模型驻留显存。5. 考虑使用TAESD等轻量解码器预览。 |
| 生成速度极慢 | 使用了迭代步数很高的采样器;CPU 模式运行。 | 1. 减少steps(如从 30 降至 20)。2. 确认命令行显示使用的是 CUDA(GPU),而非 CPU。3. 更换更高效的采样器,如euler。 |
5.2 性能优化与最佳实践
- 工作流模块化与保存:将调试好的功能块(如“模型加载编码区”、“动画配置区”、“输出保存区”)使用“节点组(Node Group)”功能折叠起来,使主工作流更清晰。务必经常点击“Save”按钮保存工作流(
.json),并“Save (with preview)”保存带缩略图的版本(.png),方便分享和复用。 - 使用预览节点:在关键步骤后(如 VAE 解码后)添加
“Preview Image”节点,可以实时查看中间输出,便于调试。 - 参数外置与批处理:对于需要频繁修改的参数(如提示词、种子、帧数),可以使用
“Primitive”节点(如字符串、整数输入框),并将其提升为工作流输入。这样可以在不打开节点内部的情况下快速调整。结合 ComfyUI 的 API,可以实现用脚本批量替换参数并生成视频。 - 生产环境考量:
- 版本管理:记录工作流所用到的所有插件版本、模型版本。升级任一组件都可能破坏现有工作流。
- 资源隔离:对于长时间运行的视频生成任务,最好在独立的 Python 环境或容器中运行 ComfyUI,避免干扰其他服务。
- 日志监控:关注 ComfyUI 命令行窗口的输出日志,其中包含内存使用、错误堆栈等关键信息。
- 输出管理:定期清理
output文件夹,或修改输出路径到有足够空间的分区。考虑编写后处理脚本,对生成的视频进行自动转码、压缩或上传。
从零开始搭建 ComfyUI 工作流是一个从理解数据流到熟练拼接节点的过程。最初的挫折感源于对节点功能的陌生和连接逻辑的不解,但一旦掌握了“模型 -> 编码 -> 采样 -> 解码”这条主干,再复杂的流程也是在这基础上的扩展。对于 AI 视频生成,关键在于理解“时间”维度是如何通过batch_size、运动模块和潜在空间插值引入的。接下来,你可以尝试探索 ControlNet 对视频姿势的控制,或者集成 TTS 节点为视频自动配音,将静态的工作流升级为真正的自动化视频生产管线。