mcpField
W
wan-flf-video

wan-flf-video

github.com/artokun创意与媒体87639 次安装2 天前更新
代码仓库

关于 wan-flf-video

面向 ComfyUI 的 WAN 2.2 首尾帧视频生成技能,说明必需的 Hi-Lo 双模型采样流程,并提供原生与 WanVideoWrapper 工作流及模型配置指南。

主要功能

  1. 01Hi-Lo 双模型两阶段采样
  2. 02原生与 WanVideoWrapper 流程
  3. 03模型和 LoRA 配置指南
  4. 04帧缩放与条件设置
  5. 05可选 SeedVR2 放大

适用场景

  1. 01根据首尾图像生成过渡视频
  2. 02配置 WAN 2.2 采样工作流
  3. 03用 WanVideoWrapper 设置缓存或上下文窗口

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/artokun/comfyui-mcp --skill wan-flf-video

安装后在 Claude Code 中输入/wan-flf-video确认已加载。

附带文件references/workflows.md

详细介绍

WAN 2.2 首尾帧(FLF)视频工作流

概述

首尾帧(FLF)视频生成会将一张起始图像和一张结束图像作为输入,生成两者之间平滑过渡的视频。WAN 2.2 I2V(图生视频)14B 模型非常适合此任务。

关键:双 Hi-Lo 架构(必需)

WAN 2.2 I2V 使用分离噪声架构。 与 WAN 2.1 不同,2.2 模型采用 HighNoise 和 LowNoise 两个独立组件训练,分别处理不同的去噪范围。必须在双阶段 KSamplerAdvanced 设置中同时使用这两个模型。 只使用单个模型会导致输出质量低下、效果异常。

  • HighNoise 模型(第 1 阶段,步骤 0→N/2)建立结构、运动和构图
  • LowNoise 模型(第 2 阶段,步骤 N/2→N)细化细节,并保持与输入帧的一致性
  • 两个阶段共享来自 WanFirstLastFrameToVideo 的相同条件输入
  • 第 1 阶段返回含噪潜变量 → 第 2 阶段从此处继续

WAN 2.2 I2V 绝不可只用一个模型搭配单个 KSampler。

可使用两种原生方案:

  1. 原生双 Hi-Lo(默认):WanFirstLastFrameToVideo + 双 KSamplerAdvanced 两阶段处理
  2. WanVideoWrapper:WanVideoVACEStartToEndFrame + WanVideoVACEEncode + WanVideoSampler(VACE、缓存、上下文窗口)

模型

UNET 配对(始终同时加载 Hi 和 Lo)

Remix NSFW(推荐,内置 lightning,fp16):

模型加载器备注
Wan2.2_Remix_NSFW_i2v_14b_high_lighting_fp16_v2.1.safetensorsUNETLoaderHighNoise,内置 lightning 加速
Wan2.2_Remix_NSFW_i2v_14b_low_lighting_fp16_v2.1.safetensorsUNETLoaderLowNoise,内置 lightning 加速

GGUF Q8(替代方案,需要外部 lightning LoRA):

模型加载器备注
Wan2.2-I2V-A14B-HighNoise-Q8_0.ggufUnetLoaderGGUFHighNoise,量化版
Wan2.2-I2V-A14B-LowNoise-Q8_0.ggufUnetLoaderGGUFLowNoise,量化版

官方 fp8:

模型加载器备注
wan2.2_i2v_high_noise_14B_fp8_scaled.safetensorsUNETLoaderHighNoise,需要 lightning LoRA
wan2.2_i2v_low_noise_14B_fp8_scaled.safetensorsUNETLoaderLowNoise,需要 lightning LoRA
文本编码器
模型节点备注
nsfw_wan_umt5-xxl_bf16_fixed.safetensorsCLIPLoaderGGUF (type=wan)针对 NSFW 调优,搭配 Remix 模型使用
umt5_xxl_fp8_e4m3fn_scaled.safetensorsCLIPLoader (type=wan)标准 UMT5-XXL fp8
CLIP Vision + VAE
组件节点模型
CLIP VisionCLIPVisionLoaderclip_vision_h.safetensors
VAEVAELoaderwan_2.1_vae.safetensors

ModelSamplingSD3(必需)

WAN 2.2 使用流匹配,并要求对每个 UNET 应用 ModelSamplingSD3:

{"class_type": "ModelSamplingSD3", "inputs": {"model": ["<unet>", 0], "shift": 5}}

lightning/Remix 模型的 shift=5。标准(非 lightning)模型的 shift=8。

Lightning LoRA

Remix NSFW 模型已内置 lightning,无需外部 LoRA。

对于 GGUF/fp8 模型,请搭配使用 Hi/Lo lightning LoRA:

  • wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors → HighNoise UNET
  • wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors → LowNoise UNET

LoRA 堆栈(rgthree)

每条模型路径都有两个堆叠加载器(通用 + 专用),每个加载器支持 4 个 LoRA 插槽:

Hi path: UNETLoader(HN) → ModelSamplingSD3(shift=5) → Hi Common Stack → Hi Lora Stack → MODEL_HI
Lo path: UNETLoader(LN) → ModelSamplingSD3(shift=5) → Lo Common Stack → Lo Lora Stack → MODEL_LO

通用堆栈用于存放共享 LoRA(质量/风格)。专用堆栈用于存放特定模型变体的 LoRA。未使用的插槽请设为 "None"。即使不使用 LoRA,也要包含这些堆栈。它们会将 CLIP 传递给文本编码。

图像缩放(ImageResizeKJv2)

在 FLF 和 CLIPVisionEncode 之前,必须将输入帧缩放到目标视频分辨率。结束帧会继承起始帧缩放后的宽度和高度,以确保尺寸一致。

{"class_type": "ImageResizeKJv2", "inputs": {
  "image": ["<load_image>", 0], "width": 480, "height": 720,
  "upscale_method": "nearest-exact", "keep_proportion": "crop",
  "pad_color": "0, 0, 0", "crop_position": "center", "divisible_by": 2
}}

KSamplerAdvanced 两阶段设置

参数阶段 1(Hi)阶段 2(Lo)
modelHi LoRA 堆栈输出Lo LoRA 堆栈输出
add_noise启用禁用
steps44
cfg11
sampler_nameuni_pcuni_pc
schedulerbetabeta
start_at_step02
end_at_step24
return_with_leftover_noise启用禁用
latent_imageWanFLF 输出[2]阶段 1 输出[0]

两个阶段共用来自 WanFirstLastFrameToVideo 输出 [0] 和 [1] 的相同正向/负向条件。

对于标准(非 lightning)模型:steps=20,在第 10 步处分段,cfg=4,sampler=euler,scheduler=simple,shift=8。

负向提示词(必需)

始终包含质量负向提示词:

The tones are vibrant, overexposed, static, details are unclear, subtitles, style, work, painting, image, still, overall grayish, worst quality, low quality, JPEG compression artifacts, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, distorted limbs, merged fingers, motionless image, cluttered background, three legs, many people in the background, walking backwards

节点:WanFirstLastFrameToVideo

Required Inputs:
  - positive: CONDITIONING (from CLIPTextEncode)
  - negative: CONDITIONING (from CLIPTextEncode with negative prompt)
  - vae: VAE
  - width: INT (from ImageResizeKJv2 end frame output[1])
  - height: INT (from ImageResizeKJv2 end frame output[2])
  - length: INT (default 81, step 4) — number of frames
  - batch_size: INT (default 1)

Optional Inputs:
  - clip_vision_start_image: CLIP_VISION_OUTPUT (from CLIPVisionEncode)
  - clip_vision_end_image: CLIP_VISION_OUTPUT (from CLIPVisionEncode)
  - start_image: IMAGE (resized start frame)
  - end_image: IMAGE (resized end frame)

Outputs:
  - [0] positive: CONDITIONING → feed to BOTH Hi and Lo KSamplerAdvanced
  - [1] negative: CONDITIONING → feed to BOTH Hi and Lo KSamplerAdvanced
  - [2] latent: LATENT → feed to Hi Pass only (Lo Pass gets Hi Pass output)

流程

UNETLoader (HighNoise) → ModelSamplingSD3 (shift=5) → Hi Common Stack → Hi Lora Stack → MODEL_HI
UNETLoader (LowNoise) → ModelSamplingSD3 (shift=5) → Lo Common Stack → Lo Lora Stack → MODEL_LO
CLIPLoaderGGUF (wan) → CLIP
  ├─ CLIPTextEncode (positive) → CONDITIONING
  └─ CLIPTextEncode (negative) → CONDITIONING
CLIPVisionLoader → CLIPVisionEncode (start) + CLIPVisionEncode (end)
VAELoader → VAE
LoadImage (start) → ImageResizeKJv2 (480x720) → resized start
LoadImage (end) → ImageResizeKJv2 (match dims) → resized end

WanFirstLastFrameToVideo (positive, negative, vae, clip_vision_start, clip_vision_end,
  start_image, end_image, width/height from resize)
  → modified positive [0], modified negative [1], latent [2]

KSamplerAdvanced (Hi: MODEL_HI, steps 0→2, add_noise=enable, return_leftover=enable)
  → noisy LATENT
KSamplerAdvanced (Lo: MODEL_LO, steps 2→4, add_noise=disable, return_leftover=disable)
  → final LATENT

VAEDecode → IMAGE → VHS_VideoCombine (raw output)
                   → VRAM_Debug → SeedVR2VideoUpscaler (1080p) → VHS_VideoCombine (upscaled)

完整工作流(API JSON)

完整的 Native FLF(Remix NSFW + Lightning)图位于 references/workflows.md。

可选:使用 SeedVR2 放大视频

在 VAEDecode 后添加,以 AI 增强方式将视频放大至 1080p。使用 VRAM_Debug 在生成和放大之间释放 VRAM:

{
  "25": { "class_type": "VRAM_Debug", "inputs": {
    "image_pass": ["23", 0], "empty_cache": true, "gc_collect": true, "unload_all_models": true
  }},
  "26": { "class_type": "SeedVR2LoadDiTModel", "inputs": {
    "model": "seedvr2_ema_3b_fp8_e4m3fn.safetensors", "device": "cuda:0",
    "blocks_to_swap": 0, "swap_io_components": false, "cache_model": false, "attention_mode": "sdpa"
  }},
  "27": { "class_type": "SeedVR2LoadVAEModel", "inputs": {
    "model": "ema_vae_fp16.safetensors", "device": "cuda:0",
    "encode_tiled": false, "decode_tiled": false, "cache_model": false
  }},
  "28": { "class_type": "SeedVR2VideoUpscaler", "inputs": {
    "image": ["25", 1], "dit": ["26", 0], "vae": ["27", 0],
    "seed": 0, "resolution": 1080, "max_resolution": 0,
    "batch_size": 5, "uniform_batch_size": false, "color_correction": "lab"
  }},
  "29": { "class_type": "VHS_VideoCombine", "inputs": {
    "images": ["28", 0], "frame_rate": 16, "loop_count": 0,
    "filename_prefix": "wan_flf_upscaled", "format": "video/h264-mp4",
    "pingpong": false, "save_output": true,
    "pix_fmt": "yuv420p", "crf": 19, "save_metadata": true, "trim_to_audio": false
  }}
}

替代方案:搭配 Lightning LoRA 使用 GGUF 模型

使用 GGUF Q8 模型而非 Remix 时,添加配对的 lightning LoRA:

Hi path: UnetLoaderGGUF(HN Q8) → ModelSamplingSD3(shift=5) → LoraLoaderModelOnly(hi_noise_lightning) → Hi Common Stack → Hi Lora Stack
Lo path: UnetLoaderGGUF(LN Q8) → ModelSamplingSD3(shift=5) → LoraLoaderModelOnly(lo_noise_lightning) → Lo Common Stack → Lo Lora Stack

LoRA 文件:

  • Unknown\no tags\wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors
  • Unknown\no tags\wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors

方案 2:WanVideoWrapper(高级控制)

使用 WanVideoWrapper 自定义节点包,更灵活地控制条件、缓存、上下文窗口和高级功能。

与 Native 的主要区别
  • 使用 WANVIDEOMODEL 类型,而非通用的 MODEL
  • 使用 WANVIDIMAGE_EMBEDS 进行条件输入,而非 CONDITIONING
  • 自带采样器(WanVideoSampler),支持 shift 参数和调度器选项
  • 支持 TeaCache、MagCache、EasyCache,以优化速度
  • 支持上下文窗口,可生成更长的视频
  • VACE 模块提供更灵活的帧条件控制
基于 VACE 的 FLF 流程
WanVideoModelLoader → WANVIDEOMODEL
WanVideoVAELoader → WANVAE
WanVideoTextEncode → WANVIDEOTEXTEMBEDS
WanVideoClipVisionEncode (start + end images) → WANVIDIMAGE_CLIPEMBEDS

WanVideoVACEStartToEndFrame (start_image, end_image, num_frames=81)
  → images batch, masks

WanVideoVACEEncode (vae, input_frames, input_masks, width, height, num_frames)
  → WANVIDIMAGE_EMBEDS (vace_embeds)

WanVideoSampler (model, image_embeds, text_embeds, steps, cfg, shift, scheduler)
  → LATENT

WanVideoDecode (vae, samples) → IMAGE → VHS_VideoCombine → MP4
WanVideoSampler 设置
参数标准Lightning说明
steps304
cfg6.01.0
shift5.05.0Flow matching shift
schedulerunipceulerWanVideoWrapper 自带调度器
force_offloadtruetrue采样后将模型移至 CPU
何时使用 WanVideoWrapper 而非 Native
功能NativeWanVideoWrapper
简洁性更简单更复杂
双 Hi-Lo手动两阶段可能在内部处理
LoRA 加载Lora Loader Stack (rgthree)WanVideoLoraSelect → WanVideoModelLoader lora(参见 merge_loras 注意事项)
缓存(TeaCache)不支持内置
上下文窗口不支持WanVideoContextOptions
块交换(VRAM)不支持WanVideoBlockSwap
VACE 条件控制不支持完整支持 VACE
长视频(>81 帧)有限InfiniteTalk / 上下文窗口

建议:标准 FLF 转场使用 Native 双 Hi-Lo。需要缓存、上下文窗口、VRAM 管理或高级条件控制时,使用 WanVideoWrapper。

⚠️ 关键:在 fp8 缩放模型上使用 merge_loras=false

通过 WanVideoLoraSelect → WanVideoModelLoader 的 lora 输入加载 LoRA 时,如果模型经过 fp8 量化(quantization=fp8_e4m3fn_scaled,例如官方的 wan2.2_i2v_high/low_noise_14B_fp8_scaled 权重),必须将 WanVideoLoraSelect 节点的 merge_loras 设为 false。

  • merge_loras=true(节点默认值)会尝试将 LoRA 差量合并进已经量化的 fp8 权重。此合并路径会在 加载 LoRA 时导致 ComfyUI 硬崩溃。进程会直接退出,不留下 Python 回溯信息(因此 panel_get_errors / 前端都不会显示任何内容;只会表现为进程重启或类似 OOM 的 症状)。这是此封装中“加载 LoRA 时崩溃”报告的首要原因。
  • merge_loras=false 会在前向传播期间以运行时补丁的方式应用 LoRA,而不是合并。它对 fp8 安全,速度损失可以忽略不计。对于 fp8 hi/lo I2V 模型上的 lightx2v 4 步 lightning LoRA(hi + lo),这是正确的设置。
  • 它也能与 block swap 完美配合:WanVideoBlockSwap(例如将 40 个 block 中的 20 到 30 个移至 RAM)+ merge_loras=false,是在 24GB 显卡上以 720p/81f 运行 fp8 14B I2V 时经过验证的组合。(如果使用的是未量化的 bf16/fp16 模型,则 merge_loras=true 没问题。)

另外,在 720p/81f 下,请在 WanVideoDecode 上启用 enable_vae_tiling=true。 整帧解码是另一个常见的未捕获 OOM 崩溃点。

分辨率与帧数

标准分辨率
纵横比分辨率百万像素
纵向 2:3480x7200.35MP(推荐默认值)
横向 16:9832x4800.4MP
纵向 9:16480x8320.4MP
正方形640x6400.4MP

宽度和高度必须能被 16 整除。使用 ImageResizeKJv2,并设置 divisible_by: 2 和 keep_proportion: crop。

帧数
  • 16fps 下 81 帧 = 约 5 秒(默认,推荐)
  • 16fps 下 49 帧 = 约 3 秒(更快,运动较少)
  • 16fps 下 121 帧 = 约 7.5 秒(更长,需要更多 VRAM)
  • 帧数应为 4n + 1(1、5、9、……、49、81、121)
帧率

WAN 2.2 输出的标准帧率:16 fps。

视频输出

VHS_VideoCombine
{
  "class_type": "VHS_VideoCombine",
  "inputs": {
    "images": ["<vae_decode>", 0],
    "frame_rate": 16,
    "loop_count": 0,
    "filename_prefix": "wan_flf",
    "format": "video/h264-mp4",
    "pingpong": false,
    "save_output": true,
    "pix_fmt": "yuv420p",
    "crf": 19,
    "save_metadata": true,
    "trim_to_audio": false
  }
}

VRAM 注意事项

使用 Remix fp16 的双 Hi-Lo
  • 依次加载两个 UNET(ComfyUI 会在两次运行之间卸载模型):每个约 14GB
  • NSFW UMT5-XXL bf16:约 8GB(文本编码后卸载)
  • CLIP Vision H:约 1.5GB(编码后卸载)
  • VAE:约 200MB
  • 潜变量(480x720 下 81 帧):约 1-2GB

ComfyUI 会在两次运行之间卸载模型来管理 VRAM。Lo UNET 加载前会先卸载 Hi UNET。

提示
  1. 从其他模型系列切换到 WAN 前,务必先运行 clear_vram
  2. 在生成和 SeedVR2 放大之间使用 VRAM_Debug 节点,以释放所有 VRAM
  3. 对于 24GB GPU,480x720 下 81 帧是实际可行的上限
  4. Remix NSFW 模型已内置 lightning。无需单独的 LoRA,总计 4 步

Morph LoRA(平滑变形)

默认情况下,FLF 会在帧间产生过渡/溶解效果。若要实现真正的变形(一个形状连续变为另一个形状),请在 Hi 和 Lo 两条路径上都使用 morph LoRA。

Magical Morph(推荐)
变体文件强度备注
HighNoisewan2.2_i2v_magical_morph_highnoise.safetensors0.7-1.0应用于 Hi Common 堆栈
LowNoisewan2.2_i2v_magical_morph_lownoise.safetensors0.7-1.0应用于 Lo Common 堆栈
  • 来源:NikolaSigmoid/wan2.2-i2v-loras-magical-morph
  • 无需触发词。LoRA 会修改去噪行为
  • 强度为 1.0 时可能会增加视觉闪光/粒子效果。若想获得更干净的变形效果,可降至 0.7-0.8
  • 与 Remix NSFW 模型兼容(不与内置 lightning 冲突)
SkinMorph Redmond(替代方案——侧重面部/身体)

用于人与人之间的变形(身份、性别转换):

  • 触发词:Skin morph
  • 强度:0.8-1.0
  • 来源:CivitAI

提示词技巧

除了起始/结束状态,还要描述转换过程中的动作:

Good: "A small cat sitting on the ground smoothly transforms and grows into a woman standing tall, seamless transformation, cinematic"
Bad: "A cat and a girl"

重要:提示词语言会影响视觉效果。

  • 避免使用 "magical"、"enchanted"、"mystical" 等词语。它们会产生字面意义上的闪光/粒子效果
  • 使用简洁的动作描述:"smoothly transforms"、"gradually reshapes"、"seamlessly morphs"、"transitions into"
  • 变形 LoRA 负责处理变形效果。提示词应描述动作和形态变化,而非风格
  • 当主体大小不同时,加入尺寸/位置提示:"grows into"、"expands upward"、"shrinks down"

设置速查

配置Lightning(Remix)标准
模型Remix NSFW Hi+Lo fp16Official Hi+Lo fp8
CLIPnsfw_wan_umt5-xxl_bf16_fixedumt5_xxl_fp8_e4m3fn_scaled
ModelSamplingSD3 shift58
总步数420
Hi pass end_at_step210
CFG14
Sampleruni_pceuler
Schedulerbetasimple
是否需要外部 LoRA否(内置)是(配对 hi/lo)

多步骤工作流模式

锚点帧策略(比例)

当起始帧和结束帧中的主体大小不同时(例如,小猫 → 高个子人物),先生成“锚点”帧(构图最复杂的那一帧),然后用 Qwen Edit 根据它创建另一帧。这样可以:

  • 保持帧间背景/场景一致
  • 确保相对比例正确(编辑结果会继承场景比例)
  • 获得更好的 FLF 效果,因为两帧共享相同的视觉上下文

示例:猫变女孩:

  1. 用 Z-Image 生成一名站在谷仓前的女孩(她占满画面)
  2. Qwen Edit:"将女人替换成一只坐在图像底部的小猫"
  3. FLF:猫(起始)→ 女孩(结束)。由于谷仓确定了比例,因此大小关系正确

反面示例:分别独立生成猫和女孩会导致比例不匹配。

完整工作流
  1. 用 Z-Image/SDXL/Flux 生成锚点帧(站立主体使用纵向构图)
  2. 用 Qwen Edit 创建第二帧。编辑会保留场景上下文
  3. 在不同模型系列之间切换时清空 VRAM
  4. 将两帧都作为输入。 如果这些帧是前一阶段的 ComfyUI 输出(即上文生成/编辑的帧),请对每个输出的 { filename, subfolder?, type? } 使用 upload_image (action:"stage"),并将返回的输入文件名传入各自的 LoadImage。(如果帧已在本地磁盘上,请使用 upload_image (action:"image")。)绝不要将输出文件复制到文件系统的 input/ 路径中,也不要猜测该路径。ComfyUI 的输入/输出目录可能是自定义的(--input-directory / --output-directory),因此猜测路径会导致 LoadImage 拒绝文件(Invalid image file),浪费渲染资源。upload_image (action:"stage") 会通过服务 API(/view → /upload/image)进行处理,从而正确解析实际目录。
  5. 如果需要变形,运行搭配变形 LoRA 的双 Hi-Lo FLF
  6. 可选:用 SeedVR2 升频至 1080p

RTX 4090 上经验证的耗时:Z-Image(35 秒)→ Qwen Edit(78 秒)→ WAN FLF 81 帧(139 秒)= 总计约 4 分钟。

使用已保存的工作流

修改或执行任何已保存的 WAN FLF 工作流之前,使用 get_workflow (action:"analyze") 了解其内容。它会返回结构化摘要,包含各部分、节点 ID、关键设置和虚拟连线。不需要原始 JSON。

get_workflow(action="analyze", filename="Wan FirstLastFrame Advanced.json")                # summary view (default)
get_workflow(action="analyze", filename="Wan FirstLastFrame Advanced.json", view="flat")   # mermaid diagram

只有在 enqueue_workflow 或 create_workflow (action:"modify") 需要原始 JSON 时,才使用 get_workflow。

来源

  • 官方: 未找到。
  • 实证: 采样器数值、连线和提示词说明来自 packs/ 中可用的图表及观察到的渲染结果;并非供应商的提示词指南。

评论

支持 Markdown