Nodes/comfyui-seedance-nodes/Seedance – Image to Video (First Frame)
ComfyUI Node

Seedance – Image to Video (First Frame)

Seedance Image-to-Video (First Frame)

By theclueless-ai·Created 5 months ago·Updated 5 months ago· 0
Seedance – Image to Video (First Frame)
  • first_frame
  • reference_video
  • reference_audio
  • video
  • last_frame
  • frames
  • video_url
  • video_path
  • last_frame_url
api_key
promptThe camera slowly zooms out.
modeldreamina-seedance-2-0-260128
ratioadaptive
duration5
resolutiondefault
generate_audiofalse
watermarkfalse
return_last_frametrue
poll_interval10
max_wait600
image_url_override
reference_video_url
reference_audio_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 to adaptive, 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 is dreamina-seedance-2-0-260128, and longer clips cost more and take longer.
  • resolution - default, 480p, 720p, or 1080p. "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's first_frame to 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_key is empty and ARK_API_KEY isn'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.
CategorySeedance/Video Generation

Inputs (17)

NameTypeDefaultDescription
api_keySTRING
first_frameIMAGEComfyUI IMAGE tensor used as the first frame of the video.
promptSTRINGThe camera slowly zooms out.Describes how the image should be animated. Use [Video 1] / [Audio 1] in prompt.
modelCOMBOdreamina-seedance-2-0-2601281 options: dreamina-seedance-2-0-260128
ratioCOMBOadaptive6 options: 16:9, 9:16, 1:1, 4:3, 3:4, adaptive
durationINT54–15Video duration in seconds. Seedance 2.0 supports 4–15 s. seedance-1-5-pro-251215 is capped at 12 s.
resolutionCOMBOdefault4 options: default, 480p, 720p, 1080p
generate_audioBOOLEANfalse
watermarkBOOLEANfalse
return_last_frameBOOLEANtrueAsk the API for a watermark-free PNG of the last frame.
poll_intervalINT105–60
max_waitINT60060–3600
image_url_overrideoptSTRINGHTTP URL override for the first frame (skips IMAGE input).
reference_videooptVIDEOConnect 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_urloptSTRINGHTTP URL of a reference video. Used only when reference_video is not connected. Reference as [Video 1] in the prompt.
reference_audiooptAUDIOConnect any ComfyUI AUDIO node (Load Audio, etc.). Takes priority over reference_audio_url. Reference as [Audio 1] in the prompt.
reference_audio_urloptSTRINGHTTP URL of a reference audio track. Used only when reference_audio is not connected. Reference as [Audio 1] in the prompt.

Outputs (6)

NameTypeDescription
videoVIDEO
last_frameIMAGE
framesIMAGE
video_urlSTRING
video_pathSTRING
last_frame_urlSTRING