Seedance – Image to Video (First Frame)
Seedance Image-to-Video (First Frame)
- first_frame
- reference_video
- reference_audio
- video
- last_frame
- frames
- video_url
- video_path
- last_frame_url
You've got a still you love and you want it to move. That's the whole pitch of this node: feed it a ComfyUI IMAGE, describe the motion, and your image becomes the first frame of a Seedance video. The model animates forward from it - a slow zoom, a camera push-in, a character blinking to life.
The honest framing first: this isn't a local model. Seedance 2.0 is ByteDance's closed video line, and it lives behind the BytePlus ARK API, not on your GPU. The node is a thin HTTP client that packages your image, calls the cloud, waits, and drops the finished clip back into your graph. No model download, no VRAM math, no checkpoint - just a bill at the end of the month. If that's a dealbreaker, the KB's take on API nodes is worth reading: an API node is the right tool for a model you were never allowed to download, and the wrong default for one you can. Seedance is squarely in the first camp - there are no weights to grab.
What you actually set
The input that matters is first_frame - connect any IMAGE output (LoadImage, a VAE decode, or the images output of the Seedream node in this same pack). Then:
prompt- describes how the image should animate. "The camera slowly zooms out." is the default and honestly a fine starting point.ratio- defaults toadaptive, which lets the API match your image's aspect ratio. Leave it alone unless you specifically want to force a crop.duration- 4 to 15 seconds. The model isdreamina-seedance-2-0-260128, and longer clips cost more and take longer.resolution-default,480p,720p, or1080p. "Default lets the API decide"; pick 480p for cheap drafts.generate_audio- ambient audio on or off. It costs extra and adds render time; flip it on only when you want it.
There's also image_url_override if your image is already hosted somewhere (S3, a CDN) - it skips the base64 upload step entirely.
How it works under the hood
The node converts your IMAGE tensor to a PNG base64 data-URI, POSTs it to the ARK /contents/generations/tasks endpoint, then polls every poll_interval seconds (default 10) until the task finishes or max_wait (default 600) runs out. The finished mp4 lands in ComfyUI/output/ as seedance_<timestamp>.mp4.
You get six outputs, and two of them earn their keep:
video- a native VIDEO object you wire straight into Save Video or any preview node (it falls back to a file-path STRING on older ComfyUI builds).last_frame- the final frame as an IMAGE tensor. This is the killer feature: plug it into the next node'sfirst_frameto chain clips without a cut.frames- every frame as an IMAGE batch, handy for inspection or a contact sheet.video_url(48-hour CDN link),video_path,last_frame_url- for when you want the file elsewhere.
Install
ComfyUI Manager: search comfyui-seedance-nodes and install. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/theclueless-ai/comfyui-seedance-nodes
pip install -r ComfyUI/custom_nodes/comfyui-seedance-nodes/requirements.txt
Dependencies are light - requests, Pillow, numpy, and opencv-python (that last one does the frame extraction). No models to download. Then set your key:
export ARK_API_KEY="your-key-here"
or paste it straight into the node's api_key field. Get the key at the BytePlus console (ap-southeast-1 region). Restart ComfyUI and the node appears under Seedance / Video Generation.
Where people get burned
- No key, no video. If
api_keyis empty andARK_API_KEYisn't set, the node raises a clear error before it ever hits the network. - Timeouts. The API queues tasks, so 1080p/10s jobs can outlast the default 600s
max_wait. Bump it - up to 3600. - Cost creeps. Every run is a metered API call; a handful of 10-second clips adds up fast. Draft at 480p, and remember your images and prompts are leaving your machine.
- Frame extraction failing almost always means opencv-python didn't install - check it's actually in your environment.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| first_frame | IMAGE | ComfyUI IMAGE tensor used as the first frame of the video. | |
| prompt | STRING | The camera slowly zooms out. | Describes how the image should be animated. Use [Video 1] / [Audio 1] in prompt. |
| model | COMBO | dreamina-seedance-2-0-260128 | 1 options: dreamina-seedance-2-0-260128 |
| ratio | COMBO | adaptive | 6 options: 16:9, 9:16, 1:1, 4:3, 3:4, adaptive |
| duration | INT | 54–15 | Video duration in seconds. Seedance 2.0 supports 4–15 s. seedance-1-5-pro-251215 is capped at 12 s. |
| resolution | COMBO | default | 4 options: default, 480p, 720p, 1080p |
| generate_audio | BOOLEAN | false | — |
| watermark | BOOLEAN | false | — |
| return_last_frame | BOOLEAN | true | Ask the API for a watermark-free PNG of the last frame. |
| poll_interval | INT | 105–60 | — |
| max_wait | INT | 60060–3600 | — |
| image_url_overrideopt | STRING | HTTP URL override for the first frame (skips IMAGE input). | |
| reference_videoopt | VIDEO | Connect any ComfyUI VIDEO node (Load Video, another Seedance output, etc.). Takes priority over reference_video_url. Reference as [Video 1] in the prompt. | |
| reference_video_urlopt | STRING | HTTP URL of a reference video. Used only when reference_video is not connected. Reference as [Video 1] in the prompt. | |
| reference_audioopt | AUDIO | Connect any ComfyUI AUDIO node (Load Audio, etc.). Takes priority over reference_audio_url. Reference as [Audio 1] in the prompt. | |
| reference_audio_urlopt | STRING | HTTP URL of a reference audio track. Used only when reference_audio is not connected. Reference as [Audio 1] in the prompt. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| last_frame | IMAGE | — |
| frames | IMAGE | — |
| video_url | STRING | — |
| video_path | STRING | — |
| last_frame_url | STRING | — |