zhenzhen-vidu-q4-preview(4合1)
Four video models, one node, and a real duration slider
- api_config
- image1
- image2
- image3
- image4
- image5
- image6
- image7
- image8
- image9
- image10
- image11
- image12
- image13
- image14
- image15
- audio1
- audio2
- audio3
- video
- video_url
- task_id
- response
Vidu is one of the closed video models that shows up in ComfyUI's official Partner Node roster, and it's the one people tend to forget exists, because the noise goes to Veo, Kling and Seedance. Q4 Preview is the newest generation of it, and this node is a paid wrapper around four of its endpoints from T8mars/Comfyui-zhenzhen (贞贞的平价AI小屋).
The "4合1" in the display name is literal. One node covers vidu-q4-preview-i2v, vidu-q4-preview-r2v, and the -global- versions of both - image-to-video and reference-to-video, domestic and overseas routes. You pick one in the model dropdown and the node talks to that endpoint. The practical consequence: you can A/B the domestic and global routes against the same prompt and input without rebuilding the graph, which is otherwise an afternoon of copying nodes.
What you actually set
model - the four-way switch above. Default is vidu-q4-preview-i2v.
prompt - required as a widget, but its tooltip is the real instruction: R2V requires a prompt; empty I2V uses natural subtle motion. Leave it blank on i2v and the node sends "Animate the reference image with natural subtle motion." On r2v the validator enforces a non-empty prompt, because reference-to-video needs to know what to do with those references.
seconds - a 3-to-16 second ladder, sent as a string. This is the number that prints your invoice, so it's the first thing to cut when you're iterating.
resolution - 540p, 720p, 1080p, 2k, 4k. 540p is a genuinely useful draft tier: the composition and the motion are what you're judging at that stage, not the pixel count. Along with seconds, this is the other multiplier on cost.
ratio - 16:9, 9:16, 1:1, 4:3, 3:4. For r2v only; i2v inherits the framing from your input image.
generate_audio (default on), is_rec (default on) and watermark (default off) are booleans passed into the request metadata. generate_audio is the one worth knowing: this family does native sound, so leaving it on is how you get a clip with audio rather than a silent one. is_rec is passed through verbatim with no explanation in the code or the README - leave it true unless you have a reason not to.
Images: fifteen slots, image1 through image15, and the two modes want completely different things from them. i2v requires exactly image1 - that's your first frame. r2v takes 1 to 15 references and is where this node earns its keep: character plus wardrobe plus product plus background, all as references. Each slot holds exactly one image; a batch of two in one slot is a hard error.
Audio: three slots, each with two mutually exclusive doors - audio1/audio2/audio3 take a local AUDIO, and audio_url1/audio_url2/audio_url3 take a public MP3 URL. Connect both to the same slot and the node refuses. Local audio is transcoded to MP3 with FFmpeg, which ships inside the portable ComfyUI build - if you see "Vidu Q4 local audio requires FFmpeg", that's the missing piece, and it only affects the local-AUDIO path, never the URL path.
Outputs: video (ComfyUI's VIDEO type - straight into Save Video), video_url, task_id, and response.
Installing it
Manager → search Comfyui-zhenzhen, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-zhenzhen
No models to download. The pack's requirements.txt adds aiohttp, aiohttp-cors, GitPython, matrix-client, transformers, huggingface-hub, psutil, nest_asyncio, openai, opencv-python, numpy, Pillow, requests and torch; opencv-python matters here because it's what writes the placeholder video when skip_error swallows a failure.
Then add Zhenzhen API Settings, paste your key, and wire api_config into the node. The pack's shipped vidu-q4-preview-i2v-lowprice.json workflow is exactly this: settings → Load Image → this node → Save Video, with the key left blank on purpose.
Where people get burned
Wrong image count for the mode. i2v with no image, i2v with two images, r2v with zero - all three fail before submission with a specific message. The source checks for exactly this, so the error text is trustworthy; read it.
A 15-second 4K clip with audio. That's the most expensive corner of the parameter space, and it can also outlive your patience: polling runs every 4 seconds for up to 1,800 seconds by default before it gives up. If you need longer, SEEDANCE_MAX_POLL_TIME is the environment variable, set before ComfyUI starts.
Retrying with skip_error on. You get a 512×512 dark-blue clip that says "Seedance request failed" instead of a stack trace. Great for unattended batches, a confusing five minutes if you forgot you enabled it.
404s that are really 443s. If the relay is unreachable at all, you'll get connection errors, not node errors. The README is explicit that the workshop needs a working proxy (TUN mode, and ditch the aggressive firewall suites). Set the connection up before debugging anything inside the graph.
Long downloads dying mid-stream. The pack retries media downloads with a 120-second floor per attempt and will re-route around a broken HTTP_PROXY/HTTPS_PROXY environment variable. If a clip generates fine and then never lands, that's the subsystem to suspect.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | vidu-q4-preview-i2v | 4 options: vidu-q4-preview-i2v, vidu-q4-preview-r2v, vidu-q4-preview-global-i2v, vidu-q4-preview-global-r2v |
| prompt | STRING | R2V requires a prompt; empty I2V uses natural subtle motion. | |
| seconds | COMBO | 5 | 14 options: 3, 4, 5, 6, 7, 8, +8 |
| resolution | COMBO | 720p | 5 options: 540p, 720p, 1080p, 2k, 4k |
| ratio | COMBO | 16:9 | 5 options: 16:9, 9:16, 1:1, 4:3, 3:4 |
| generate_audio | BOOLEAN | true | — |
| is_rec | BOOLEAN | true | — |
| watermark | BOOLEAN | false | — |
| audio_url1 | STRING | Public MP3 URL or local AUDIO, not both. | |
| audio_url2 | STRING | Public MP3 URL or local AUDIO, not both. | |
| audio_url3 | STRING | Public MP3 URL or local AUDIO, not both. | |
| api_configopt | ZHENZHEN_SEEDANCE2_CONFIG | — | |
| image1opt | IMAGE | — | |
| image2opt | IMAGE | — | |
| image3opt | IMAGE | — | |
| image4opt | IMAGE | — | |
| image5opt | IMAGE | — | |
| image6opt | IMAGE | — | |
| image7opt | IMAGE | — | |
| image8opt | IMAGE | — | |
| image9opt | IMAGE | — | |
| image10opt | IMAGE | — | |
| image11opt | IMAGE | — | |
| image12opt | IMAGE | — | |
| image13opt | IMAGE | — | |
| image14opt | IMAGE | — | |
| image15opt | IMAGE | — | |
| audio1opt | AUDIO | — | |
| audio2opt | AUDIO | — | |
| audio3opt | AUDIO | — | |
| skip_erroropt | BOOLEAN | false | — |
| seedopt | INT | 00–18446744073709550000 | ComfyUI cache seed only; not sent to the API. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_url | STRING | — |
| task_id | STRING | — |
| response | STRING | — |