Ark Video Generate (Volces)
Seedance and Wan, straight from your ComfyUI graph — for a price
- first_frame_image
- last_frame_image
- frames
- frame_count
This node does the opposite of what most ComfyUI video nodes do. It doesn't load weights onto your GPU and it doesn't sample a thing locally. ArkVideoGenerate phones ByteDance's Volcengine cloud, waits for a video to come back, and hands you a tensor. No VRAM, no model download, no local diffusion at all. The price of admission is a paid Volcengine account, an API key, and the patience to watch a queue.
Why would you want that? Because of one model on the dropdown: doubao-seedance-1-0-pro-250528. Seedance is ByteDance's flagship video model, and per the classic ByteDance posture, the flagship stays on the API - it has never been and almost certainly will never be open-weighted. This node is one of the few ways to run Seedance inside your normal ComfyUI graph instead of pasting prompts into a web console. If you have a GPU that already runs Wan 2.1 happily, honestly skip this pack's wan2-1-14b-flf2v option and run Wan locally - that model is free on your disk. The draw here is Seedance-grade quality at 1080p without buying a bigger card.
How it works. The mechanism is refreshingly transparent once you read the source. The node builds your prompt text, then appends your settings as flag tokens: --resolution 720p --ratio 16:9 --duration 5 --fps 24 --seed -1 --watermark false --camera_fixed false. That's not a hack - it's literally how Volcengine's Ark content-generation API parses parameters, and the official SDK handles it. Any images you feed in get base64-encoded and attached with first_frame / last_frame roles. Then it creates a task, polls the API every 3 seconds until the status flips to succeeded, downloads the MP4 to ComfyUI/output/ark_video/{task_id}.mp4, and decodes it with OpenCV into a (T, H, W, C) 0–1 float tensor. One thing to know up front: this is a blocking node. It holds its queue slot for however many minutes the cloud takes, so don't put ten of them in a batch and expect a quick afternoon.
Inputs that matter. The only truly required one is api_key - a plain string, no default, and nothing happens without it. model is a two-choice dropdown (Seedance Pro or hosted Wan 2.1 FLF2V). Then the quick settings: resolution (480p/720p/1080p), ratio (from 16:9 through 9:21, plus keep_ratio and adaptive), duration (5 or 10s), and fps (16 or 24). seed defaults to -1 for random. watermark and camera_fixed pass straight through as flags - turn the watermark on if you want the safety net, off if you hate it. The two IMAGE inputs are the interesting part: first_frame_image is your I2V anchor, last_frame_image optionally locks the ending - but it requires a first frame, enforced in code with a ValueError, so don't wire a last frame alone. callback_url is optional and the node polls regardless, so you can mostly ignore it.
Outputs. Two: frames, an IMAGE tensor (T, H, W, C) in 0–1, and frame_count, an INT of how many frames you got. Wire frames straight into a video preview or save node (or a VHS-style loader for downstream work). That's the whole pipeline - cloud in, tensor out.
Install. Clone it into your custom nodes and restart:
cd ComfyUI/custom_nodes/
git clone https://github.com/zl9739379/ComfyUI-ArkVideoGenerate
ComfyUI Manager may not list it - it's a small pack (this page sees about three impressions a month) - so the clone is the reliable path. requirements.txt pulls in the official volcengine-python-sdk[ark], plus numpy, Pillow and torch. The code also imports cv2 and requests, which aren't in that file - ComfyUI bundles opencv-python and requests in its own environment, so it usually just works. If you hit a ModuleNotFoundError: cv2, pip install opencv-python fixes it.
Troubleshooting. The README's list is short and honest. "Cannot open video" means the download was incomplete - bad network, retry. API calls failing usually means a wrong key or no balance left, and "status stuck pending" just means the cloud queue is busy; it's a server-side queue, so waiting is the correct move. The one gotcha nobody mentions: the key is a per-node plain-text input, so a workflow JSON you share contains your API key. Use a throwaway key for anything you post publicly, or rotate it after.
Also worth knowing: this pack is essentially untested by the community - I found zero meaningful discussion of it anywhere. It's a one-person, MIT-licensed bridge, so treat your first run as a probe: short clip, low resolution, watch what the console prints. The mechanism is sound, but this is a "verify before you trust it in a production workflow" situation.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| model | COMBO | 2 options: doubao-seedance-1-0-pro-250528, wan2-1-14b-flf2v | |
| prompt | STRING | a cat is dancing | — |
| resolution | COMBO | 720p | 3 options: 480p, 720p, 1080p |
| ratio | COMBO | 16:9 | 9 options: 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, +3 |
| duration | COMBO | 5 | 2 options: 5, 10 |
| fps | COMBO | 24 | 2 options: 16, 24 |
| seed | INT | -1-1–4294967295 | — |
| watermark | COMBO | false | 2 options: false, true |
| camera_fixed | COMBO | false | 2 options: false, true |
| first_frame_imageopt | IMAGE | — | |
| last_frame_imageopt | IMAGE | — | |
| callback_urlopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |
| frame_count | INT | — |