Seedance 2.5: image to video
Give it a first frame, optionally a last frame, and a prompt; get a clip that opens on
the exact frame (frame_alignment about 0.997) and lands on the last, with photographic
grain and motion that handles hard physics: a burst of papers drifting down like
feathers, cloth, spray. Every render takes minutes, so it is the upgrade for the shots
that need it, not the drafting model. Use h3-max-image-to-video to draft and
kling-v3-image-to-video for close-ups of people. It takes no references; for a
dialogue shot with a voice track, or references, use seedance-2-5-dialogue.
Inputs
- The first frame at the output size (1920×1080 for 16:9;
python-conform-to-1080p). - The last frame (optional, and the reason to pick this model for a detail that
must hold): derived from the locked first frame (
nano-banana-derive-last-frame) so hair, props and print match by construction, then cropped to the source's push-in (python-match-push-in). Look at first and last back to back on a review page before spending a render. - The shot's length. Durations are whole seconds from 4 to 30.
Run it
Call describe("fal/bytedance/seedance-2.5/us/image-to-video") before the first run in
a job. Before that first run, a test included, show the person the still that will move
and ask (core skill: the person decides every look).
run("fal/bytedance/seedance-2.5/us/image-to-video", {
"image_url": "<job>/video/shot09_first_1080p.jpg",
"end_image_url": "<job>/video/shot09_last_1080p.jpg",
"prompt": "<Seedance prompt, see below>",
"duration": "4",
"resolution": "720p",
"generate_audio": true,
"bitrate_mode": "high"
}, into="<job>/video/raw", unit="shot09_seedance", tag="shot09")
duration: a string, the shot's length rounded up to whole seconds, at least"4".resolution:480p,720por1080p, lowercase. 720p takes about 6 min a render; use it for drafts, or when only part of the frame ships. 1080p takes 6 to 30 min; use it for a full-frame shot that ships at 1080p quality. 720p plustopaz-upscaleonly saves money where quality matters less: it softens fine detail.- No
seedand noaspect_ratio: the shape follows the image. Takes differ by sampling alone; run each as its own call. bitrate_mode: "high"keeps the grain.
Prompt
Load seedance-2-5-prompt-format first and write the image-to-video shape: no header,
no @Image labels. Replace every handle with plain words ("@Nora" becomes "the woman").
For this mode:
- Integer-second marks only, 1 to 3 ("At the 1-second mark, a gust lifts…"), then "then".
- Describe the physics in plain, visible terms and its pace: "the pages drift down slowly in long side-to-side arcs like feathers settling".
- When the clip runs longer than the shot: "The shot's action lasts 3.4 seconds; play it at natural real-time speed, then hold the final moment with only small natural movement until the clip ends." Never plan to speed the clip up.
- With a last frame, say what the end of the shot shows.
What you get
An MP4 that opens on the first frame and, with a last frame, lands on it at the end,
with its own generated sound effects. The clip is at least 4 s; trim to the shot
(ffmpeg-frame-exact-trim), keeping the untrimmed render in raw/. Upscale before
trimming.
Tips and traps
- Content filter false positives. fal sometimes rejects a render because the generated audio was flagged as sensitive. Nothing is wrong with the prompt: run it again as the next take letter.
- Cost and time. On the first job over half the spend went to Seedance, $100 of it to a 1080p batch that was abandoned. Settle the pinned frames on review pages first, render one take, look, then add takes.
- Anchored reference-to-video (the still as
@Image1plus reference pictures, no end frame) keeps the layout but opens slightly zoomed and shifted (0.86 to 0.97) and looked no better than image-to-video, whose people stay consistent because they are already in the pinned frame. Choose between them withguide-animate-a-shot. - Hair morphing mid-shot means the two pinned frames weren't continuous. Rebuild the last frame from the first rather than re-rolling.
Check it
- Frame 0 against the first frame and the end against the last:
python-check-pinned-frames. - A small detail (a logo, print) at start, middle and end, close up:
python-measure-detailand your own eyes on 100% crops. - Then a review page with the original shot beside the takes.


