BYTEDANCE / VIDEO GENERATION
Seedance 2.5
从场景描述到动态画面,按生成秒数付费。
seedance-2.5
图片参考 按秒计费 通道维护中
算一算,这个镜头多少钱
提交时预扣,技术失败自动退回余额。
生成时长
4–30 秒
可选画质
480P / 720P / 1080P
画幅
16:9 · 9:16 · 1:1 · 4:3 · 3:4
参考图片
最多 30 张
参考视频 / 音频
10 / 10 段
交付方式
异步生成 · 原视频下载
创作须知
参考素材如何影响生成?
上传图片、视频或音频,也可粘贴 HTTPS 素材链接。图片用于人物、场景和风格参考,支持的类型与数量以当前规格为准。
失败和成片保存
任务最终失败自动退回预扣;请在生成后 7 天内下载。生成结果有随机性,不保证每次都符合主观预期。
| 模型 / 规格 | VidBudget | 官方参考价 | 节省 | |
|---|---|---|---|---|
| Seedance 2.5 480P · 按秒 | $0.1 /秒 | $0.103 | 省 2% | 查看 ↗ |
| Seedance 2.5 720P · 按秒 | $0.158 /秒 | $0.231 | 省 31% | 查看 ↗ |
| Seedance 2.5 1080P · 按秒 | $0.33 /秒 | — | — | 查看 ↗ |
官方参考价:BytePlus ModelArk,核对日期 2026-10-30。Special 按 720P × 30 秒折算,非官方按条产品;带参考音频另计。无数据的规格不作比较。
视频结果
等待创作准备好你的第一个镜头
添加素材与提示词,点击「生成视频」。
完成后可在这里预览、下载。
从这个模型开始接入
完整文档 →curl https://vidbudget.com/v1/videos/generations \
-H "Authorization: Bearer $VIDBUDGET_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: YOUR_UNIQUE_REQUEST_ID" \
-d '{
"model": "seedance-2.5",
"prompt": "湖面泛起微光,镜头缓缓向前推进",
"duration": 5,
"resolution": "720P",
"aspect_ratio": "16:9"
}'
curl https://vidbudget.com/v1/videos/jobs/TASK_ID -H "Authorization: Bearer $VIDBUDGET_API_KEY"
import os, time, uuid, requests
BASE = "https://vidbudget.com"
headers = {"Authorization": "Bearer " + os.environ["VIDBUDGET_API_KEY"]}
response = requests.post(BASE + "/v1/videos/generations", headers={**headers,
"Idempotency-Key": str(uuid.uuid4())}, json={'model': 'seedance-2.5', 'prompt': '湖面泛起微光,镜头缓缓向前推进', 'duration': 5, 'resolution': '720P', 'aspect_ratio': '16:9'}, timeout=85)
response.raise_for_status()
job = response.json()
print("保存任务 ID,断线后继续查询:", job["id"])
deadline = time.monotonic() + 7200
while job["status"] not in ("succeeded", "failed") and time.monotonic() < deadline:
time.sleep(5)
response = requests.get(BASE + "/v1/videos/jobs/" + job["id"], headers=headers, timeout=85)
response.raise_for_status()
job = response.json()
if job["status"] == "succeeded":
url = job["data"][0]["url"]
if not url.startswith("https://media.vidbudget.com/videos/"):
raise RuntimeError("Unexpected media URL")
with requests.get(url, stream=True, timeout=85) as media:
media.raise_for_status()
with open("video.mp4", "wb") as output:
for chunk in media.iter_content(1024 * 1024):
output.write(chunk)
elif job["status"] == "failed":
print("失败,预扣已退回:", job["error"])
else:
print("尚未完成,请继续查询原任务:", job["id"])
// Node.js 18+; save the task ID before polling.
const base = "https://vidbudget.com";
const headers = {Authorization: `Bearer ${process.env.VIDBUDGET_API_KEY}`};
async function request(path, options = {}) {
const response = await fetch(base + path, {...options, signal: AbortSignal.timeout(85000)});
const data = await response.json();
if (!response.ok) throw new Error(JSON.stringify(data.error));
return data;
}
let job = await request('/v1/videos/generations', {method: 'POST', headers: {...headers,
'Content-Type': 'application/json', 'Idempotency-Key': crypto.randomUUID()},
body: JSON.stringify({"model": "seedance-2.5", "prompt": "湖面泛起微光,镜头缓缓向前推进", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9"})});
console.log('Task ID:', job.id);
const deadline = Date.now() + 7200000;
while (!['succeeded', 'failed'].includes(job.status) && Date.now() < deadline) {
await new Promise(resolve => setTimeout(resolve, 5000));
job = await request('/v1/videos/jobs/' + job.id, {headers});
}
console.log(job.status === 'succeeded' ? job.data[0].url : job);