Wan Video Empty Embeds_v2 (QQ)
The empty envelope for Wan's image conditioning
- control_embeds
- extra_latents
- image_embeds
Wan's video sampler doesn't take a plain image. It takes an image_embeds container - a dict that describes the target shape of the clip and carries whatever conditioning got attached along the way. Normally you build that by VAE-encoding an actual image, but sometimes there is no image: pure text-to-video, a first-frame-only pass, or a workflow where you want to construct the container yourself. That's the whole job of WanVideoEmptyEmbeds_v2. Give it width, height, and frame count, and it hands back an empty image_embeds envelope with the right shape - no VAE involved.
It's part of siraxe's experimental ComfyUI-WanVideoWrapper_QQ pack (now ComfyUI-SA-Nodes-QQ), the add-on layer on top of Kijai's ComfyUI-WanVideoWrapper. This node is effectively the no-image branch of the pack's WanVideoImageToVideoEncode_v2: if you feed that node no start/mid/end images, it internally calls this exact class. So you're not learning a weird one-off - you're learning the thing the I2V encoder falls back to.
How it works
The math is the interesting part, and it's straight out of Wan's VAE. Wan compresses time 4x and space 8x, so a clip of N frames at H×W becomes a latent of ((N - 1) // 4) + 1 frames at H // 8 × W // 8. The node does exactly that conversion with VAE_STRIDE = (4, 8, 8):
target_shape = (16, (num_frames - 1) // 4 + 1, height // 8, width // 8)
That target_shape plus the frame count is the skeleton of the image_embeds dict it returns. This is also why your frame count needs to be 4n + 1 - Wan encodes 81 frames to 21 latents, and if you ask for a number that doesn't line up, you get the off-by-a-frame weirdness the community constantly hits. The _v2 in the name is because this is the updated flavor of Kijai's original empty-embeds node, tuned for the 2.x wrapper conventions.
Two optional inputs ride along inside the envelope: control_embeds (a WANVIDIMAGE_EMBEDS control signal, for the Fun control model) and extra_latents (a latent prepended for the Pusa model). Neither is needed to start; they're there so you can carry a control signal inside the empty envelope instead of building a separate one.
The inputs that matter
width/height- the pixel size of the clip you're conditioning. Defaults 832×480, the classic Wan 2.2 starter resolution.num_frames- default 81, the native Wan context.
The single output is image_embeds (WANVIDIMAGE_EMBEDS), which wires straight into the wrapper's video sampler alongside your text conditioning.
Installing it
ComfyUI Manager, searching "ComfyUI-SA-Nodes-QQ", or:
cd ComfyUI/custom_nodes
git clone https://github.com/siraxe/ComfyUI-WanVideoWrapper_QQ.git
Restart after cloning. No extra dependencies - the pack declares none - but remember this node is a brick without Kijai's ComfyUI-WanVideoWrapper and the actual Wan weights behind it.
Where people get burned
The main trap is treating it as a resolution helper when it's really a plumbing node. It doesn't resize anything and it doesn't validate your input - you can ask for 832×480×81 or 4096×4096×10000 and it will happily build a shape that explodes later in the sampler. Keep dimensions VAE-friendly (multiples of 8, frame count at 4n+1) and you're fine. And if you find yourself reaching for this because you have a start image you're skipping, double-check you actually want T2V - an I2V workflow that never encodes its reference image is usually a workflow with the wrong node in it.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| width | INT | 83264–8096 | Width of the image to encode |
| height | INT | 48064–8096 | Height of the image to encode |
| num_frames | INT | 811–10000 | Number of frames to encode |
| control_embedsopt | WANVIDIMAGE_EMBEDS | control signal for the Fun -model | |
| extra_latentsopt | LATENT | First latent to use for the Pusa -model |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image_embeds | WANVIDIMAGE_EMBEDS | — |