Comfyui中图像转视频专用生成类模型【003】
·
ImageOnlyCheckpointLoader 深度详解(图像转视频专用)
ImageOnlyCheckpointLoader 是 ComfyUI 中专门用于加载视频生成类模型的 Checkpoint 加载器,核心适配 SVD(Stable Video Diffusion) 这类「无文本编码器、依赖图像输入」的模型,是实现图生视频的关键节点。
一、核心定位与适用场景
1. 核心特点
- 无
CLIP文本编码器输出:因为视频生成模型(如 SVD)不依赖文本指令,仅靠初始图像驱动生成视频帧。 - 强依赖
CLIP_VISION图像编码器:用于提取初始图像的视觉特征,作为视频生成的条件。 - 输出
MODEL+VAE:分别负责视频帧的生成和图像解码。
2. 适用模型与场景
表格
| 适用模型 | 核心场景 | 输入要求 |
|---|---|---|
| SVD(svd.safetensors) | 短视频生成(14 帧左右) | 单张初始图像 |
| SVD-XT(svd_xt.safetensors) | 更长视频生成(25 帧左右) | 单张初始图像 |
| 其他视频生成类 Checkpoint | 自定义视频生成工作流 | 按模型要求输入 |
二、API 核心参数详解
1. 输入参数
表格
| 参数名 | 类型 | 说明 |
|---|---|---|
ckpt_name |
字符串 | 必填,必须是 ComfyUI/models/checkpoints 目录下的视频模型文件名(如 svd.safetensors) |
2. 输出参数(索引是节点连接的关键!)
RETURN_TYPES = ("MODEL", "CLIP_VISION", "VAE")
表格
| 输出索引 | 输出类型 | 作用 | 下游连接节点 |
|---|---|---|---|
| 0 | MODEL |
视频生成主模型 | 连接 KSampler 的 model 参数 |
| 1 | CLIP_VISION |
图像特征编码器 | 连接 SVD_img2vid_Conditioning 的 clip_vision 参数 |
| 2 | VAE |
图像解码器 | 连接 SVD_img2vid_Conditioning 的 vae 参数 + VAEDecode 的 vae 参数 |
划重点:输出索引 1 是
CLIP_VISION,不是常规的CLIP,这是和CheckpointLoaderSimple的核心区别!
三、完整 JSON 工作流拆解(图转视频实战)
以 SVD 生成 14 帧短视频为例,完整工作流包含 6 个节点,我们逐节点拆解逻辑。
1. 完整 JSON 代码
json
{
"1": {
"inputs": { "ckpt_name": "svd.safetensors" },
"class_type": "ImageOnlyCheckpointLoader"
},
"2": {
"inputs": { "image": "start_frame.png", "upload": "image" },
"class_type": "LoadImage"
},
"3": {
"inputs": {
"width": 1024,
"height": 576,
"video_frames": 14,
"motion_bucket_id": 127,
"fps": 6,
"augmentation_level": 0,
"clip_vision": ["1", 1],
"init_image": ["2", 0],
"vae": ["1", 2]
},
"class_type": "SVD_img2vid_Conditioning"
},
"4": {
"inputs": {
"seed": 12345,
"steps": 20,
"cfg": 8,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["1", 0],
"positive": ["3", 0],
"negative": ["3", 1],
"latent_image": ["3", 2]
},
"class_type": "KSampler"
},
"5": {
"inputs": { "samples": ["4", 0], "vae": ["1", 2] },
"class_type": "VAEDecode"
},
"6": {
"inputs": { "filename_prefix": "SVD_video", "images": ["5", 0] },
"class_type": "SaveImage"
}
}
2. 节点逻辑拆解(核心是 ImageOnlyCheckpointLoader 的连接)
表格
| 节点 ID | 节点类型 | 核心作用 | 关键连接(和节点 1 的关联) |
|---|---|---|---|
| 1 | ImageOnlyCheckpointLoader |
加载 SVD 模型 | 输出 3 个组件,供下游节点调用 |
| 2 | LoadImage |
加载初始图像(视频第一帧) | 无直接关联,输出给节点 3 |
| 3 | SVD_img2vid_Conditioning |
视频条件构建核心 | 1. clip_vision: ["1", 1] → 用节点 1 的图像编码器提特征2. vae: ["1", 2] → 用节点 1 的解码器做图像预处理3. init_image: ["2", 0] → 初始图像 |
| 4 | KSampler |
生成视频帧 latent 数据 | 1. model: ["1", 0] → 用节点 1 的主模型驱动生成2. positive/negative/latent_image: 来自节点 3 的条件输出 |
| 5 | VAEDecode |
把 latent 转成视频帧图像 | vae: ["1", 2] → 用节点 1 的解码器解码 |
| 6 | SaveImage |
保存所有视频帧 | 接收节点 5 的图像输出,后续可合并为 MP4 |
3. 关键参数说明(节点 3 是视频生成的核心)
节点 SVD_img2vid_Conditioning 的参数直接决定视频效果:
width/height:视频分辨率,SVD 推荐1024×576/576×1024video_frames:生成的视频帧数,SVD 最大 14 帧、SVD-XT 最大 25 帧motion_bucket_id:运动幅度控制,值越大,视频画面运动越剧烈(推荐 50-200)fps:视频帧率,默认 6,决定视频播放速度augmentation_level:图像增强程度,0 为无增强,值越大画面变化越大
四、Python API 调用完整流程
1. 步骤总览
- 确认 SVD 模型已放入
models/checkpoints目录 - 编写上述 JSON 工作流
- 提交工作流并获取任务 ID
- 等待生成完成后,下载视频帧并合并为 MP4
2. 完整 Python 代码
python
运行
import requests
import json
import os
from PIL import Image
import cv2
import numpy as np
# ComfyUI 基础地址
COMFYUI_URL = "http://127.0.0.1:8188"
# 1. 定义图转视频工作流
video_workflow = {
"1": {
"inputs": { "ckpt_name": "svd.safetensors" },
"class_type": "ImageOnlyCheckpointLoader"
},
"2": {
"inputs": { "image": "start_frame.png", "upload": "image" },
"class_type": "LoadImage"
},
"3": {
"inputs": {
"width": 1024,
"height": 576,
"video_frames": 14,
"motion_bucket_id": 127,
"fps": 6,
"augmentation_level": 0,
"clip_vision": ["1", 1],
"init_image": ["2", 0],
"vae": ["1", 2]
},
"class_type": "SVD_img2vid_Conditioning"
},
"4": {
"inputs": {
"seed": 12345,
"steps": 20,
"cfg": 8,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["1", 0],
"positive": ["3", 0],
"negative": ["3", 1],
"latent_image": ["3", 2]
},
"class_type": "KSampler"
},
"5": {
"inputs": { "samples": ["4", 0], "vae": ["1", 2] },
"class_type": "VAEDecode"
},
"6": {
"inputs": { "filename_prefix": "SVD_video", "images": ["5", 0] },
"class_type": "SaveImage"
}
}
# 2. 提交工作流
def submit_video_workflow(workflow):
response = requests.post(
f"{COMFYUI_URL}/api/prompt",
json={"prompt": workflow}
)
return response.json()["prompt_id"]
# 3. 获取生成的视频帧文件名
def get_video_frames(prompt_id):
while True:
history = requests.get(f"{COMFYUI_URL}/api/history/{prompt_id}").json()
if prompt_id in history and "outputs" in history[prompt_id]:
outputs = history[prompt_id]["outputs"]
frames = []
for node in outputs.values():
if "images" in node:
frames = [img["filename"] for img in node["images"]]
return sorted(frames) # 按帧顺序排序
# 等待生成完成
import time
time.sleep(2)
# 4. 将视频帧合并为 MP4 视频
def frames_to_video(frames_dir, frame_files, fps=6, output_name="output_video.mp4"):
# 读取第一帧获取分辨率
first_frame = cv2.imread(os.path.join(frames_dir, frame_files[0]))
height, width = first_frame.shape[:2]
# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
video_writer = cv2.VideoWriter(output_name, fourcc, fps, (width, height))
# 逐帧写入
for frame_file in frame_files:
frame_path = os.path.join(frames_dir, frame_files)
frame = cv2.imread(frame_path)
video_writer.write(frame)
video_writer.release()
print(f"视频已保存为 {output_name}")
# ------------------- 执行主流程 -------------------
if __name__ == "__main__":
# 提交任务
prompt_id = submit_video_workflow(video_workflow)
print(f"任务 ID: {prompt_id}")
# 获取视频帧
frame_files = get_video_frames(prompt_id)
print(f"生成 {len(frame_files)} 帧: {frame_files}")
# 合并为视频(ComfyUI 输出目录默认是 output)
frames_to_video("./output", frame_files, fps=6)
五、避坑指南(新手必看)
-
模型文件必须正确
- 必须用视频生成模型(SVD/SVD-XT),不能用 SD1.x/SDXL 等文生图模型,否则会报错「缺少 CLIP_VISION」。
- 文件名必须和
checkpoints目录下完全一致(含.safetensors后缀)。
-
节点连接不能错索引
- 下游节点要
CLIP_VISION时,必须连 节点 1 的索引 1,而不是索引 0 或 2。 SVD_img2vid_Conditioning必须同时传入clip_vision+vae+init_image,缺一不可。
- 下游节点要
-
视频帧数和分辨率匹配
- SVD 模型最大支持 14 帧,超过会报错;SVD-XT 最大 25 帧。
- 分辨率推荐
1024×576或576×1024,非 16:9 比例可能导致画面拉伸。
-
运动幅度参数调优
motion_bucket_id是核心:值太小(<50)视频几乎不动;值太大(>200)画面会剧烈抖动、失真。
六、效果优化技巧
- 想让视频运动更自然:降低
motion_bucket_id(如 80-120),提高steps(如 25-30)。 - 想让视频细节更清晰:降低
augmentation_level(设为 0),提高cfg值(如 9-10)。 - 想生成更长视频:换用 SVD-XT 模型,将
video_frames设为 25,fps设为 8。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)