VividAI 参考素材生视频
Nine Image Slots, Three Video, Three Audio — and One Material Per Slot
- config
- prompt
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- video_1
- video_2
- video_3
- audio_1
- audio_2
- audio_3
- VIDEO
VividAIReferenceVideo (显示 "VividAI 参考素材生视频") is the interesting one in this pack. The other two nodes take a prompt and give you a picture or a clip. This one takes up to fifteen pieces of your media - nine images, three videos, three audio tracks - and asks the hosted model to make something that's recognisably built from them. Character consistency, style transfer, lip-sync, motion reference: the whole reason people tolerate a cloud call in a local pipeline usually lives here.
It's also the fiddliest node in the pack, because fifteen optional sockets is fifteen chances to feed one wrong.
What it does with your media
Every connected port gets converted to a file, uploaded, and then referenced in the generation request. The conversion is fixed and you don't get to choose it:
- IMAGE → PNG, ≤20 MB, and exactly one image per port. A batch of two on
image_1is an error, not two references. - VIDEO → MP4/H.264, ≤40 MB.
- AUDIO → WAV, mono or stereo (one or two channels), ≤40 MB, and again one track per port.
Uploads are ordered image 1→9, then video 1→3, then audio 1→3, and the submission references them in that sequence. Keep that in mind when you're counting which slot got which file, because the service sees an ordered list of references, not a named gallery.
After conversion, each upload goes out, and only then does the job get submitted. That ordering is deliberate: the task is created after the media exists remotely, so a resume doesn't re-upload everything.
The inputs that matter
The required stack is identical to the other two generation nodes - config from VividAI 配置, model, prompt, quality (default 720p), ratio (default 16:9), duration (0 = don't submit a duration), history_capacity, and the hidden node_key, generation_token, model_rules. Output is a single native VIDEO, so it feeds core SaveVideo or any node downstream that takes a video.
Then the ports: image_1 … image_9 (IMAGE), video_1 … video_3 (VIDEO), audio_1 … audio_3 (AUDIO). All optional. Which ones actually do something is decided by the per-model rule JSON in 当前模型能力配置 - max_images / max_videos / max_audios cap how many are used (defaults 9/3/3, matching the port count), and min_images etc. let you declare that a model requires at least one reference. Get the count wrong and the node raises "…数量不满足模型能力配置" before spending anything.
The ports are lazy. If a model's rule says max_images: 2, the node only asks the engine to evaluate image_1 and image_2 - slots 3 through 9 keep their wires but their upstream branches aren't executed, encoded or uploaded. That's genuinely useful: you can leave a whole img2img chain hanging off image_5, switch models, and it costs you nothing. The README is careful to note this isn't a security or validity bypass - ComfyUI still validates the graph's types and links up front, so you can't sneak a LATENT into an image port and call it disabled.
And the same cache semantics as everywhere else in the pack: changing a reference doesn't create a new task. Swap the image, rewire the audio, nothing happens until you press 下次运行重新生成 and run. The old material stays selected and reusable. For a node with fifteen sockets that you're about to iterate on forty times, this is the right call, but it does mean the first ten minutes of confusion are compulsory.
Install
Manager → search ComfyUI VividAI. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Neko1t/ComfyUI-plugin
cd ComfyUI-plugin
uv pip install --python /path/to/ComfyUI/python -r requirements.txt
Dependencies: httpx, Pillow, numpy, av. PyAV is doing real work here - it's how your VIDEO inputs get re-encoded to MP4 (via ComfyUI's own VideoInput.save_to) and how incoming results are validated. Install into ComfyUI's interpreter and restart.
Wiring references without pain
The pack ships examples/reference-video.json, which wires an EmptyImage into image_1 as a placeholder - swap in LoadImage for a real still. For video_* you need a source of native VIDEO (core LoadVideo, or any pack that outputs the native type, not a frame batch). For audio_* likewise: native AUDIO, e.g. from a LoadAudio node.
A practical habit: don't fill nine slots because they exist. Most hosted models behave better with two or three strong references, and every extra file is byte budget and upload time. Keep the batch rule in mind too - if a node upstream emits a batch of four images, you can't point it at one port. One image per port, so either load them individually or split the batch first.
Troubleshooting
"每个图片端口只接受一张 IMAGE" (each image port accepts one image). You fed a batch to a single port. Split it, or use separate ports for separate images.
"…素材须非空且不超过 20/40 MB". A converted file blew the size cap - a 4K video re-encoded to MP4 or a long WAV hits 40 MB faster than you'd think. Trim it upstream.
Ports that look connected but do nothing. Either the model rule caps them (raise max_images / max_videos / max_audios in 当前模型能力配置) or you haven't pressed 下次运行重新生成 since wiring them. Both are silent by design.
ratio errors. Video ratios are pinned to 16:9 and 9:16. 1:1 is a text-to-image value and gets rejected here before submission.
Upload worked, generation didn't. That's usually the model list - the node re-checks GET /v1/models before submitting, so a model that vanished from the service fails locally with "所选模型当前不可用". Refresh the model list and pick again; your uploaded references and previous clips are untouched.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| config | VIVIDAI_CONFIG | — | |
| model | STRING | — | |
| prompt | STRING,OPENAI_CONTENT | 支持普通文本,也支持 OpenAI messages/input 内容对象 | |
| quality | STRING | 720p | — |
| ratio | STRING | 16:9 | — |
| duration | INT | 00–3600 | 0 表示不提交时长;模型要求时需填写 |
| history_capacity | INT | 31–100 | — |
| node_key | STRING | — | |
| generation_token | STRING | — | |
| model_rules | STRING | {} | — |
| image_1opt | IMAGE | — | |
| image_2opt | IMAGE | — | |
| image_3opt | IMAGE | — | |
| image_4opt | IMAGE | — | |
| image_5opt | IMAGE | — | |
| image_6opt | IMAGE | — | |
| image_7opt | IMAGE | — | |
| image_8opt | IMAGE | — | |
| image_9opt | IMAGE | — | |
| video_1opt | VIDEO | — | |
| video_2opt | VIDEO | — | |
| video_3opt | VIDEO | — | |
| audio_1opt | AUDIO | — | |
| audio_2opt | AUDIO | — | |
| audio_3opt | AUDIO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| VIDEO | VIDEO | — |