前言:之前一直在跑 SDXL 图片工作流做漫剧配图,最近换到 Wan2.2 做短视频素材,踩了一堆网上很少细说的坑:FP16/FP8 精度混用爆显存、视频编码出错、长片段时序崩坏、API 异步任务丢帧。很多分享包只给成品工作流,不讲模型分片加载、offload 策略、批量生成的异常重试逻辑。本文是我在 RTX4060 8G 机器上真机调试两周沉淀下来的落地方案,全部代码、参数、排错步骤都实测可用,适合 AI 短剧、漫剧动态素材批量生产。
一、本机硬件 & 环境清单(和上一篇绘图环境保持统一)
- 显卡:RTX4060 8G(重点,Wan2.2 对显存远比 SDXL 苛刻,8G 属于勉强可用,必须 FP8 量化)
- CPU:i5-13400F
- 系统:Windows11 24H2
- Python:3.11.10(不要 3.12,Wan2 自定义节点依赖未完全适配)
- CUDA:12.1
- ComfyUI:原版 git 稳定版,和之前 SDXL 环境共用一套,不新开环境,避免依赖冲突
- 核心模型:Wan2.2-T2V-14B FP8 量化版(原版 FP16 14B 直接 OOM,8G 卡跑不动)
⚠️ 重要前置:不要直接用官方原版 FP16 权重,8G 显存必崩;优先选用社区 FP8 量化 safetensors,同时全程开启模型分片加载。 AMD 显卡 Windows 端不推荐,ROCm 视频扩散节点 bug 多,帧率极低。
二、依赖与自定义节点安装(Wan2.2 专属)
在之前已经装好的 ComfyUI 虚拟环境里面继续装依赖,不需要重建 venv。 先激活环境,CMD 执行:
cd ComfyUI venv\Scripts\activate pip install transformers accelerate sentencepiece av opencv-python
需要的自定义节点(放到ComfyUI/custom_nodes,git clone)
- ComfyUI-WanVideo(Wan2.2 核心加载、采样节点)
- ComfyUI-VideoHelperSuite(视频拼接、编码、保存 mp4,必备)
- ComfyUI_FizzNodes(循环、种子控制,批量脚本配套)
安装完节点完全关闭 ComfyUI 进程再重启,单纯刷新网页不会加载视频节点,很多人红节点就是这里踩坑。
启动 bat,新增视频显存优化参数,修改start_comfy.bat
@echo off venv\Scripts\activate python main.py --listen 0.0.0.0 --enable-cors-header --vram low --cuda-malloc --disable-xformers pause
--disable-xformers 是针对 WanVideo 节点的特殊适配,部分 xformers 版本会导致视频画面闪烁、花屏。
三、Wan2.2 文生视频基础工作流 JSON(8G 显存 FP8 适配,直接导入)
保存为 wan22_t2v_base.json,ComfyUI Load 加载。
模型路径提醒:把
wan2.2-t2v-14b-fp8.safetensors放到models/diffusion_models;VAE 放到models/vae;文本编码器放到models/text_encoders,文件名必须和节点内一致,否则红节点。
{ "1": { "class_type": "WanVideoModelLoader", "inputs": { "model_name": "wan2.2-t2v-14b-fp8.safetensors", "precision": "fp8", "gpu_offload": true } }, "2": { "class_type": "CLIPTextEncode", "inputs": { "text": "A girl walking slowly in old alley, soft sunset, smooth motion, realistic, cinematic, no flicker", "clip": ["1", 1] } }, "3": { "class_type": "CLIPTextEncode", "inputs": { "text": "flicker, jitter, distorted face, blurry, extra limbs, watermark, text, bad motion", "clip": ["1", 1] } }, "4": { "class_type": "EmptyLatentVideo", "inputs": { "width": 832, "height": 480, "length": 25, "batch_size": 1 } }, "5": { "class_type": "WanVideoSampler", "inputs": { "seed": 98765432, "steps": 28, "cfg": 6.5, "sampler": "dpmpp_2m_sde", "scheduler": "karras", "denoise": 1.0, "model": ["1", 0], "positive": ["2", 0], "negative": ["3", 0], "latent": ["4", 0] } }, "6": { "class_type": "VAELoader", "inputs": { "vae_name": "wan_video_vae.safetensors" } }, "7": { "class_type": "VAEDecodeVideo", "inputs": { "samples": ["5", 0], "vae": ["6", 0] } }, "8": { "class_type": "VideoHelperSuite_SaveVideo", "inputs": { "images": ["7", 0], "filename_prefix": "wan22_out", "fps": 8, "codec": "libx264", "crf": 23 } } }
【8G 显存硬性限制,不要乱改】
- 分辨率上限 832×480,视频帧数 length 控制 20~30 帧(30 帧≈3.75s@8fps);
- 必须开启
gpu_offload,模型分层加载到显存 + 内存; - 不要叠加 ControlNet、IP-Adapter 一起跑,显存直接溢出;
- 采样步数 25-30,cfg 不要超过 7。
补充:如果是 12G 及以上显卡,可以改成 1024×576,length 开到 49 帧,精度可以尝试 FP16。
四、进阶 API 脚本:批量提交 Wan2.2 视频任务,自动下载 MP4,带失败重试
这个脚本是在之前 SDXL 图片 API 版本上改造而来,适配视频工作流,增加:任务超时重试、mp4 文件识别、日志写入、跳过重复任务,适合短剧素材批量出片。 文件名 wan22_batch_api.py
import requests import json import os import time import logging # 日志配置 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", filename="wan_batch_log.log", encoding="utf-8" ) COMFYUI_URL = "http://127.0.0.1:8188" WORKFLOW_FILE = "wan22_t2v_base.json" PROMPT_LIST_FILE = "video_prompts.txt" OUTPUT_FOLDER = "./wan_video_out" MAX_RETRY = 2 TASK_TIMEOUT = 300 os.makedirs(OUTPUT_FOLDER, exist_ok=True) def load_workflow(path: str): with open(path, "r", encoding="utf-8") as f: return json.load(f) def submit_prompt(prompt_data): try: resp = requests.post(f"{COMFYUI_URL}/prompt", json={"prompt": prompt_data}, timeout=20) resp.raise_for_status() return resp.json() except Exception as e: logging.error(f"提交任务失败:{str(e)}") return None def wait_task_finish(prompt_id: str): start_time = time.time() while True: if time.time() - start_time > TASK_TIMEOUT: logging.warning(f"任务 {prompt_id} 超时") return None try: r = requests.get(f"{COMFYUI_URL}/history/{prompt_id}", timeout=15) r.raise_for_status() hist = r.json() if prompt_id in hist: return hist[prompt_id] except Exception as e: logging.warning(f"轮询任务异常: {e}") time.sleep(2) def download_video(filename: str): dl_url = f"{COMFYUI_URL}/view?filename={filename}" save_path = os.path.join(OUTPUT_FOLDER, filename) if os.path.exists(save_path): logging.info(f"文件已存在,跳过: {filename}") return True try: r = requests.get(dl_url, timeout=60) r.raise_for_status() with open(save_path, "wb") as f: f.write(r.content) logging.info(f"视频保存成功: {filename}") return True except Exception as e: logging.error(f"下载失败 {filename}: {e}") return False if __name__ == "__main__": base_wf = load_workflow(WORKFLOW_FILE) with open(PROMPT_LIST_FILE, "r", encoding="utf-8") as f: prompt_lines = [p.strip() for p in f if p.strip()] for idx, prompt_text in enumerate(prompt_lines): logging.info(f"===== 第 {idx+1} 条提示词:{prompt_text} =====") base_wf["2"]["inputs"]["text"] = prompt_text base_wf["5"]["inputs"]["seed"] = int(time.time() * 1000) % 99999999 retry_cnt = 0 success = False while retry_cnt < MAX_RETRY and not success: task_info = submit_prompt(base_wf) if not task_info: retry_cnt += 1 time.sleep(3) continue pid = task_info["prompt_id"] logging.info(f"提交任务ID: {pid}") result = wait_task_finish(pid) if not result: retry_cnt +=1 continue # VideoHelperSuite输出结构 out_nodes = result["outputs"] for node_out in out_nodes.values(): if "videos" in node_out: for v_item in node_out["videos"]: download_video(v_item["filename"]) success = True if not success: logging.error(f"第{idx+1}条任务多次重试失败:{prompt_text}") time.sleep(4)
配套 video_prompts.txt(一行一条,适合漫剧动态镜头)
masterpiece,best quality,young woman standing at seaside,wind blows hair,slow movement,soft golden hour,smooth video masterpiece,best quality,old bookstore interior,light floating dust,slow camera pan,quiet atmosphere,no flicker masterpiece,best quality,rain drop falling on window,blurred street background,cinematic,stable motion
运行方式:
venv\Scripts\activate python wan22_batch_api.py
脚本会自动记录日志到 wan_batch_log.log,方便晚上挂机批量跑素材,第二天统一整理视频。
五、高频问题 & 排坑(真人挂机踩坑汇总)
- 采样中途爆显存 OOM优先降低视频长度 length,降低分辨率;确认模型是 FP8 量化;开启
gpu_offload;不要后台同时跑 SDXL 绘图任务抢占显存。 - 生成视频画面持续闪烁、抖动关闭 xformers,加上启动参数
--disable-xformers;把 CFG 降到 6-6.5,太高容易时序崩坏;提示词加上no flicker,stable motion。 - API 返回成功,但是没有 mp4 输出大概率 VideoHelperSuite 节点编码依赖 ffmpeg 缺失;或者 av 包版本不对,重装:
pip install av==12.0.0。 - 加载 Wan 模型直接红节点节点版本和模型不匹配;检查模型后缀,部分节点只支持 safetensors,不支持 bin;路径大小写、文件名必须严格一致。
- 视频很短,帧率看着卡顿修改 SaveVideo 节点 fps,8fps 是显存友好值;想要流畅可以拉到 12fps,但显存占用上涨明显。