Begin exactly from Image 1 and finish on Image 2. In one continuous five-second shot, the pianist presses three gentle notes, lets both hands rise a few centimeters from the keys, then turns his head and shoulders toward the window as a light breeze moves the curtain. Use one slow, stable push-in only. Preserve the same face, hair, green sweater, seated position, piano, room layout, camera axis, and morning light throughout. Keep both hands anatomically natural and settle cleanly into the final pose without morphing. Synchronized audio: three soft piano notes, faint curtain rustle, and quiet room tone. No cuts, no extra person, no dialogue, no readable text, no logo, no product placement, no advertising, no watermark.
Seedance 2.5 Image-to-Video API
bytedance/seedance-2.5/image-to-videoSeedance 2.5(Image-to-Video)可根据参考图片和提示词生成最长 30 秒的音画同步视频,并控制运镜、光线、节奏和声音。模型会尽量延续原图的主体、构图和视觉风格,同时加入动作、对白、音乐和音效。
输入
必须上传首帧;尾帧不会自动替代首帧。
auto输出
等待运行生成的视频会显示在这里
设置必填输入、分辨率和时长,然后运行任务。
继续使用
示例
REST API
快速开始
配置认证后提交 input 对象,再使用 task_id 查询视频生成结果。
连接 Vidgo API
创建 API Key,将其安全保存在服务端,并通过 Authorization: Bearer VIDGO_API_KEY 请求头发送。
- 端点
- POST
https://api.vidgo.ai/api/generate/submit - 认证
- Authorization: Bearer VIDGO_API_KEY
提交一个生成任务
使用当前模式的最小有效 payload 提交任务。成功后会立即返回 task_id,无需等待视频生成完成。
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "seedance-2.5/image-to-video",
"input": {
"prompt": "The camera pushes in as the subject turns toward the window light.",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "auto",
"generate_audio": true,
"image_urls": [
"https://example.com/start-frame.jpg"
]
}
}')
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"等待结果
使用 task_id 查询状态。状态为 not_started 或 running 时继续查询;变为 finished 或 failed 时停止,成功后从 data.files[].file_url 读取视频地址。
查询状态
GET https://api.vidgo.ai/api/generate/status/{task_id}建议约每 2 秒查询一次,任务运行时间较长时逐步增加间隔。只在 not_started 或 running 时继续查询;变为 finished 或 failed 后立即停止。也可以在提交请求顶层添加 callback_url。
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "running",
"created_time": "2026-08-22T10:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}完整可运行示例
展开后可查看完整脚本,其中包含 HTTP 与业务码检查、task_id 校验、轮询、终态处理和超时控制。
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "seedance-2.5/image-to-video",
"input": {
"prompt": "The camera pushes in as the subject turns toward the window light.",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "auto",
"generate_audio": true,
"image_urls": [
"https://example.com/start-frame.jpg"
]
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneinput 参数
下表列出 input 对象支持的字段;请求示例还会展示顶层必填字段 model。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| prompt | string | 是 | — | 去除首尾空格后为 1–20,000 个字符。 |
| duration | integer | 是 | — | 闭区间 4–30 内的整数。 |
| resolution | string | 是 | — | 显式发送 480p 或 720p。 |
| aspect_ratio | string | 否 | — | 提供时必须为 auto。 |
| generate_audio | boolean | 否 | — | 是否请求生成音轨;体验区始终显式发送 true 或 false。 |
| image_urls | string[] | 是 | — | 第一项是必填首帧,第二项是可选尾帧。保持顺序,且使用公开可直接下载的 URL。 |
响应字段
提交成功后会立即返回任务信息;查询状态时可获取进度、输出文件或失败原因。
| 字段 | 类型 | 说明 |
|---|---|---|
| code | integer | 业务返回码;成功响应兼容 0 或 200。 |
| message | string | 接口返回的提示或错误信息。 |
| data.task_id | string | 用于状态查询路径的任务 ID。 |
| data.status | string | not_started、running、finished 或 failed。 |
| data.created_time | string | 任务创建时间。 |
| data.progress | integer | 任务进度,提供时取值为 0–100。 |
| data.files[] | array | 任务成功后返回的全部输出文件,顺序与接口响应一致。 |
| data.files[].file_url | string | 生成视频的公开地址。 |
| data.files[].file_type | string | 文件类型,例如 video。 |
| data.error_message | string | null | failed 状态下的错误详情。 |
任务生命周期
not_started 与 running 是非终态;finished 与 failed 是终态,遇到任一终态都必须停止轮询。
not_started任务已接收,正在等待执行。
running任务正在生成,继续使用同一 task_id 查询。
finished任务成功结束,从 data.files[].file_url 读取全部视频地址。
failed任务执行失败,读取 data.error_message 并停止轮询。
轮询与错误处理
- 认证失败401 表示 Bearer API Key 缺失或无效,修正密钥后再提交。
- 参数或余额错误400 可能表示字段无效、包含不支持的素材字段或积分不足,应先根据消息修正请求。
- 网络与超时网络请求失败不代表任务状态为 failed。请设置合理的超时时间,并重试状态查询。
- 轮询间隔初始间隔约 2 秒,长任务应逐步增加等待时间。
- 终态规则只在 not_started 或 running 时继续,finished 或 failed 都立即停止。
- 回调选项在请求顶层提供 callback_url,可接收最终任务对象;回调投递失败时仍可通过轮询查询结果。
模型规格
| 规格 | 取值 | 说明 |
|---|---|---|
| 输入模式 | 1–2 帧 | 第一张是首帧,第二张是可选尾帧。 |
| 输出 | 视频任务 | 提交后返回异步任务 ID。 |
| 分辨率 | 480p / 720p | resolution 必填且应显式发送。 |
| 时长 | 4–30 秒 | 支持 4 至 30 之间的任意整数秒数。 |
| 画面比例 | 仅 auto | 此工作流使用 auto 画面比例。 |
| 计费依据 | 输出秒数 | 480p 为 28 积分/秒,720p 为 63 积分/秒。 |
Seedance 2.5 Image-to-Video
Seedance 2.5 Image-to-Video 可根据一张参考图片和提示词生成带同步音频的连续场景。可在提示词中描述主体动作、运镜、光线和节奏,模型会在生成的视频中尽量延续原图的主体、构图和视觉风格。
为什么选择此模式?
从现有画面开始使用已有的人物、产品、环境和构图作为镜头起点,无需仅靠文字重新描述整个场景。
控制首帧之后发生什么用提示词说明接下来的动作、速度、表情、环境变化和具体运动过程。
用尾帧引导结尾需要控制最终姿态、产品状态或构图时,可添加一张尾帧作为结束参考。
分别描述主体动作和运镜先写主体如何运动,再单独说明运镜、景别、光线和氛围,减少指令混淆。
同时生成声音场景需要环境音、音效、对白或音乐时,可在生成视频的同时创建音轨。
参数说明
| 参数 | 要求 | 说明 |
|---|---|---|
| prompt | 必填 | 字符串。描述首帧之后的动作、运镜、画面变化和声音设计;去除首尾空格后长度为 1–20,000 个字符。 |
| image_urls | 必填 | 包含 1–2 个公开、可直接下载 URL 的字符串数组。第一项是首帧,第二项是可选尾帧,必须保持该顺序。 |
| duration | 必填 | 整数。设置 4–30 秒闭区间内的输出时长;体验区预选 5 秒。 |
| resolution | 必填 | 字符串。设置输出分辨率并必须显式发送;体验区预选 720p。 720p480p |
| aspect_ratio | 可选 | 字符串。此工作流使用 auto 画幅;体验区以只读方式展示并显式发送该值。 auto |
| generate_audio | 可选 | 布尔值。请求生成音轨;体验区预选 true,并显式发送当前值。 truefalse |
使用方法
选择合适的首帧首帧应包含镜头开始时需要的主体、光线、构图和画面留白。
描述画面接下来发生什么从现有画面继续写,例如:手腕缓慢转向镜头,表盘掠过一道柔和高光。
单独说明运镜再补一条镜头指令:微距特写,缓慢环绕,浅景深,柔和棚拍反光。
需要时添加尾帧只有第二张图能够明确最终姿态、排列关系或视觉过渡时,才需要添加尾帧。
配置输出选择 480p 或 720p、4–30 秒整数时长和音频开关;画面比例保持 auto。
生成并检查结果运行任务后检查主体、构图、动作与结尾之间的关系,再根据结果调整提示词或首尾帧组合。
计费
价格只由输出时长和分辨率决定;音频开关与素材数量不改变费率。
| 计费项 | 费率 | 说明 |
|---|---|---|
| 480p | 28 积分/输出秒($0.140/秒) | 4 秒为 112 积分($0.560),5 秒为 140 积分($0.700),30 秒为 840 积分($4.20)。 |
| 720p | 63 积分/输出秒($0.315/秒) | 4 秒为 252 积分($1.26),5 秒为 315 积分($1.58),30 秒为 1,890 积分($9.45)。 |
适用场景
产品展示片段为产品静帧加入旋转、材质变化、灯光变化或运镜,生成新品发布或功能展示片段。
角色表演片段把人物肖像或角色关键帧转为表演片段,通过提示词指导表情、手势、视线和镜头反应。
首尾帧转场连接风格和内容相容的首帧与尾帧,生成变形、揭示或构图变化的转场方案。
活动主视觉动态化将活动主视觉生成短视频,用于社交媒体、现场展示或创意提案。
实用技巧
- 把首帧作为镜头起点,提示词只需说明接下来发生什么,不必重复描述图片中已经清楚可见的内容。
- 不要只写“让人物动起来”,改成完整进程:她望向窗外、轻轻呼气,随后转回身,摄影机缓慢推近。
- 主体运动与摄影机运动分成两条指令,不让其中一条依赖另一条来推断。
- 使用两张图片时,保持人物身份、光线逻辑和整体美术方向彼此兼容。
- 画面比例固定为 auto,因此需要在源图中预先安排好构图和留白。
注意事项
- image_urls 可包含 1–2 个公开且可直接下载的 HTTP(S) URL,第一项为首帧,第二项为可选尾帧。
Seedance 2.5 图生视频 API — 常见问题
Seedance 2.5 Image-to-Video API 是什么?
Seedance 2.5 由 ByteDance Seed 开发。Image-to-Video API 根据一张必填首帧和提示词异步生成视频。你还可以添加尾帧来引导结尾,并选择是否同步生成音频。
如何调用 Seedance 2.5 Image-to-Video API?
使用 Bearer API Key 向 /api/generate/submit 发起 POST 请求,将 model 设为 seedance-2.5/image-to-video,并把生成参数放入 input。提交成功后会立即返回 task_id;API 标签页和完整文档中提供了可运行示例。
查看完整 API 文档Seedance 2.5 Image-to-Video API 如何计费?
480p 为 28 积分/输出秒,720p 为 63 积分/输出秒。例如 5 秒 480p 为 140 积分($0.700),5 秒 720p 为 315 积分($1.58)。
Seedance 2.5 Image-to-Video API 接受哪些输入?
在 input 中,image_urls 必须先放首帧 URL,随后可放一个尾帧 URL,数组总数为 1–2 个且顺序不可改变;aspect_ratio 只能为 auto。
如何获取生成的视频?
使用 task_id 轮询 GET /api/generate/status/{task_id}。状态为 finished 时从 data.files[].file_url 读取视频地址;状态为 failed 时停止轮询并读取错误信息。也可以通过 callback_url 接收最终结果。
应该选择哪个 Seedance 2.5 端点?
需要由现有画面定义镜头起点时选择 Image-to-Video;只从文字开始时选择 Text-to-Video;不同素材需要分别承担外观、动作、镜头或声音角色时选择 Reference-to-Video。

