Wan FMLF (QQ)
Pin the middle frame — first/middle/last reference for Wan 2.2 I2V
- positive
- negative
- vae
- start_image
- middle_image
- end_image
- clip_vision_start_image
- clip_vision_middle_image
- clip_vision_end_image
- positive_high_noise
- positive_low_noise
- negative
- latent
Standard Wan I2V gives you one anchor: the first frame. Everything after that is the model's imagination. WanFMLF gives you three anchors - first, middle, and last - so you can actually dictate what the video looks like halfway through. Want the subject to be a different pose at the exact midpoint? Feed a middle_image. Want to guarantee the ending frame? Feed an end_image. For the price of a reference image each, you get the closest thing to storyboarded video that Wan 2.2 offers.
The name comes from "First-Middle-Last Frames" (FMLF), and this node is a port/extension of wallen0322/ComfyUI-Wan22FMLF living inside siraxe/ComfyUI-WanVideoWrapper_QQ - the README calls it "a better way to add midframe control," bundled with an amplitude test, since v1.0.6.
How it works
Wan 2.2's architecture is a MoE that splits denoising into two stages: a high-noise expert that decides motion and composition, and a low-noise expert that refines detail. The FMLF trick is to condition each stage with a different strength on your middle frame - the high-noise pass locks in the trajectory (where things are moving), and the low-noise pass prevents detail flicker. That's why this node outputs two positive conditionings:
positive_high_noise- drives motion/trajectory (high_noise_strength, default 0.8).positive_low_noise- drives detail stability (low_noise_strength, default 0.2).
The node encodes your start/middle/end images into the latent and conditioning, sizes everything to your width/height/length, and hands you the paired conditionings plus a latent for the sampler. It's explicitly designed for the LightX2V distilled workflow (8 steps: 4 high-noise + 4 low-noise) - that's the model the README targets, and the motion_amplitude parameter exists specifically to fix the slow-motion look that 4-step speed LoRAs produce (default 1.15). The clip_vision_start/middle/end_image inputs accept precomputed CLIP vision outputs if you're already computing them elsewhere, letting you skip redundant encoding.
Inputs and outputs that matter
positive/negative- your text conditioning.vae- the Wan VAE (needed to build the latent).start_image,middle_image,end_image- your three anchors. Middle is the star; leave it out and you've basically got a standard I2V.middle_frame_ratio- where the middle frame sits in the timeline (default 0.5).high_noise_strength/low_noise_strength- the dual-stage knobs.motion_amplitude- motion boost for 4-step LoRA workflows.
Outputs: positive_high_noise, positive_low_noise, negative (CONDITIONING), and latent (LATENT) - wire the two positives into the high- and low-noise sampler stages respectively, and the latent into the sampler.
Installation
cd ComfyUI/custom_nodes
git clone https://github.com/siraxe/ComfyUI-WanVideoWrapper_QQ.git
Restart ComfyUI (or ComfyUI Manager → "WanVideoWrapper_QQ"). This node requires kijai's ComfyUI-WanVideoWrapper to be installed - it's a companion pack, and the README says so explicitly. No extra Python deps beyond that; the pack's requirements.txt is empty. After the v1.3.4 rename to ComfyUI-SA-Nodes-QQ, delete any old wanwrapper_qq folder.
Common issues
The classic failure is wiring it into a single-stage sampler: the whole point is the dual high/low-noise split, and if you feed only positive_high_noise into a normal sampler you lose half the conditioning. Look for a dual-stage sampler (the pack's WanVideoWrapper integration has one) and feed each expert its own positive. Second, high_noise_strength too high makes the middle frame a hard constraint and the motion stiff; too low and the middle frame is ignored. Start at the defaults (0.8/0.2) and treat them as the trajectory-vs-detail tradeoff they are. And remember the LightX2V framing - this node is tuned around 8-step distilled sampling; on the full 27B model the strengths will behave differently, so recalibrate rather than assuming.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| width | INT | 83216–16384 | — |
| height | INT | 48016–16384 | — |
| length | INT | 811–16384 | — |
| batch_size | INT | 11–4096 | — |
| start_imageopt | IMAGE | — | |
| middle_imageopt | IMAGE | — | |
| end_imageopt | IMAGE | — | |
| middle_frame_ratioopt | FLOAT | 0.500–1 | — |
| high_noise_strengthopt | FLOAT | 0.800–1 | Middle frame constraint strength for high-noise stage (determines motion trajectory) |
| low_noise_strengthopt | FLOAT | 0.200–1 | Middle frame constraint strength for low-noise stage (prevents detail flickering) |
| motion_amplitudeopt | FLOAT | 1.151–2 | Motion amplitude enhancement (fixes 4-step LoRA slow-motion issues) |
| clip_vision_start_imageopt | CLIP_VISION_OUTPUT | — | |
| clip_vision_middle_imageopt | CLIP_VISION_OUTPUT | — | |
| clip_vision_end_imageopt | CLIP_VISION_OUTPUT | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive_high_noise | CONDITIONING | — |
| positive_low_noise | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |