Vidu Q3 · Image to Video
Vidu Q3 will make your still image act — 16 seconds at a time
- image_url
- video
- task id
Vidu's reputation, in the one place it's actually discussed, is faces. The loudest thread about Q3 in 2026 was someone animating a sci-fi series whose two characters "came out better than anything I'd managed before" - subtle eye and ear movement that Wan and LTX didn't reach. Vidu Q3 has no open weights, so "how do I run this locally" has no answer. The answer is a node that calls it.
Why this node, in a graph
The whole reason to keep a cloud model inside ComfyUI rather than in a browser tab is plumbing. You've already generated the frame - a character, a product shot, an establishing plate - through your own local pipeline, with your own LoRA and your own control image. Handing that exact tensor to an image-to-video model without a save-upload-download round trip is the whole game. This node takes an IMAGE on image_url (named like a URL; it's a socket), uploads it for you, and returns a VIDEO you can pipe into Save Video or another node.
Worth saying plainly because it shapes what you're buying: on the corpus evidence, Vidu Q3 is a finishing model for shots where performance matters, not a volume model. One person's 15-minute-ish episode, with 4K upscaling, ran them $200–250. Plan shots accordingly.
How it works
The pack generates this node from Vidu's published input schema at startup - one node per model, built from the live catalog - so the fields are exactly what the endpoint accepts. Your wired-in image is uploaded once (keyed by a hash of its content, reused for 12 hours), and unwired optional fields stay out of the request entirely so the model applies its own defaults. The clip comes back as a decoded MP4 wrapped in ComfyUI's VIDEO type.
The inputs worth touching
image_url is the opening frame and the clip's first frame. The prompt describes what happens after it - action, camera, mood. Don't re-describe the picture; the model can see it. Tell it where it goes.
duration_seconds is a slider from 1 to 16 rather than a fixed menu, and it's billed per second, so the length is the main cost lever. Sixteen is a long time for a single generated shot - it will drift.
resolution is 540p, 720p or 1080p, and the pricing table has a genuinely useful quirk: 720p costs roughly double 540p, while 1080p is only a few percent over 720p. So the rational choice is 540p for drafts and 1080p for finals. Nobody should be rendering 720p here.
generate_audio and bgm are two different things and the tooltips are honest about it: the first is the sound of the scene - footsteps, dialogue, wind - synchronised with the picture. The second is a music bed on top. Music under a sound-effects track is often mush; most people turn bgm off and score it themselves.
movement_amplitude (auto, small, medium, large) is the underrated one. auto lets the model read the opening frame, which is usually right. But on a portrait or a product shot, small is how you stop the whole frame from sliding around like it's on a boat.
seed defaults to fixed: queue the same graph twice and you get the cached first result, not a second bill.
Outputs are video and task id - keep the id, it's what PopNow's console and support use to find the job.
Install
Manager > Custom Nodes Manager, search PopNow, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/popnow-ai/popnow-comfyui
No models to download, no dependency stack - it's a thin client over api.popnow.ai. You need a key from popnow.ai/api/console/keys, set as POPNOW_API_KEY or pasted into Settings > PopNow, and you should restart once more after adding it so the node list rebuilds from your account.
Where it goes wrong
If you're on the old single-file custom_nodes/popnow_api.py from popnow.ai's docs, remove it - two versions of the same node type is a confusing afternoon.
PopNow 40201 is the out-of-credits error, and it usually shows up mid-experiment after a few 16-second 1080p takes. Set Max credits per run before you start, and remember failed runs are refunded while finished ones aren't.
PopNow 40004 means that combination of settings isn't servable - check the field the message names rather than re-queueing.
Last one, and it catches people: cancelling stops the wait, not the job. The generation continues server-side, gets charged if it succeeds, and the file sits in the API console instead of your output folder. If a long take is going badly, let it finish or accept the loss.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | IMAGE | Opening frame. The clip starts from this image. | |
| prompt | STRING | Describe what happens after the opening frame: the action, the camera, and the mood. | |
| duration_seconds | INT | 51–16 | Requested output length in seconds. |
| resolution | COMBO | 720p | Output resolution. |
| movement_amplitude | COMBO | auto | How much the subject and scene move. Leave it on auto to let the model read the opening frame. |
| generate_audio | BOOLEAN | true | Request synchronised output audio. |
| bgm | BOOLEAN | true | Add background music to the clip. Separate from generate_audio, which covers the sound of the scene itself. |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The PopNow task id, for the API console logs or support. |