指南在 Makernice 上使用 Seedance 2.5 样片模式
Makernice 团队 ·
价格截至 2026 年 11 月 11 日(价表 v15)。
Seedance 2.5 样片模式让你先用便宜的 480p 样片确认镜头,再为同一镜头的 1080p 成片付费。在 Makernice 上,给字节跳动的视频模型 Seedance 2.5 的普通请求加上 draft: true,或在网页工具里打开「样片」开关,就能出一条样片。3 天内,可以把这条样片出成 1080p 成片:沿用样片参数出同一镜头的 1080p 版本,以保持细节结果一致。
什么是 Seedance 2.5 样片模式?
Seedance 2.5 样片模式是一种两步出片方式:先出 480p 样片确认镜头,再基于这条样片、沿用同样的参数出 1080p 成片。这套流程来自字节跳动,字节跳动的云平台 BytePlus 只为 Seedance 2.5 提供这项功能。Seedance 2.0 和 Seedance 2.0 Fast 没有样片模式。在 Makernice 上,Seedance 2.5 的这两步在 API 和网页工具里都能用,其它模型会拒绝 draft 字段。
怎样在 API 里开启样片模式?
样片就是一次普通的 Seedance 2.5 生成,只多一个字段:draft: true。分辨率必须是 480p,填其它分辨率会返回 400 draft_requires_480p。像其它生成一样先报价,再带上报价 id、同样的输入和 Idempotency-Key 创建任务,步骤见 Seedance 2.5 API 教程。
curl https://api.makernice.com/v1/generations/quote \
-H "Authorization: Bearer $MAKERNICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"mode": "t2v",
"prompt": "A red kite climbs over a windy beach at sunrise, slow tracking shot, long shadows on the sand",
"duration": 5,
"resolution": "480p",
"aspect_ratio": "16:9",
"draft": true
}'报价、冻结和扣费与普通 480p 片段完全一样。记下样片的 gen_ id,出成片时要用。样片的任务对象带 draft 字段:draft.expires_at 是可出成片的截止时刻,draft.final_id 是已出(进行中或已成功)的成片 id,还没出时为 null。
怎样在网页工具里开启样片模式?
在 Makernice 网页工具里选 Seedance 2.5,分辨率旁边会出现「样片」开关。打开后分辨率自动切到 480p 并锁定,价格显示为 480p 价;关掉后恢复你原来选的分辨率。其它模型不显示这个开关。
Seedance 2.5 模型页 的 Playground 也有「样片」开关,在分辨率标题右侧。打开后按钮变为「生成样片」并显示价格;样片完成后,下方显示「出 1080p 成片」按钮。
样片完成后,卡片和详情抽屉会显示剩余有效期,例如「还剩 2 天」;在生成记录列表里,样片带「样片」胶囊。登录后在网页工具(控制台或模型页 Playground)出的样片,如果还没出成片,Makernice 会在到期前 24 小时提醒你:站内铃铛一定会显示「样片还有 24 小时过期」和模型名;只有在设置里打开了「生成完成时给我发邮件」,才会同时发邮件。通过 API 出的样片不提醒,请自己看 draft.expires_at。
怎样把样片出成 1080p 成片?
在 API 里,出成片的报价只填两个字段:model 和 from_draft,后者是一条已成功样片的 gen_ id。Makernice 从样片带出其余所有参数,并把输出设为 1080p。
| 参数 | 规则 |
|---|---|
| 模式、时长和比例 | 沿用样片 |
| 提示词和素材 | 沿用样片 |
| seed 和 audio(generate_audio) | 沿用样片 |
| 分辨率 | 固定 1080p |
| 其它任何字段或附加参数 | 以 400 错误被拒 |
curl https://api.makernice.com/v1/generations/quote \
-H "Authorization: Bearer $MAKERNICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"from_draft": "gen_..."
}'然后用报价 id 和同样的两字段输入创建成片。成片是一条新任务,有自己的 gen_ id,并带 source_draft_id 指向来源样片;轮询和下载方式与其它视频相同。
curl https://api.makernice.com/v1/generations \
-H "Authorization: Bearer $MAKERNICE_API_KEY" \
-H "Idempotency-Key: demo-final-1842-attempt-1" \
-H "Content-Type: application/json" \
-d '{
"quote_id": "qt_...",
"input": {
"model": "seedance-2.5",
"from_draft": "gen_..."
}
}'在网页工具里,「出 1080p 成片」按钮在样片的卡片和详情抽屉里。只有已成功、未过期、且还没有进行中或已成功成片的样片才显示这个按钮。点击后先报价,确认框会写明报价金额、「参数沿用样片,不可修改」和到期时间。

出成片的请求在报价时就会检查。任何一项检查不通过,报价都会被拒:不建任务,也不冻结金额。
| HTTP 状态 | 错误码 | 含义 | 怎么办 |
|---|---|---|---|
| 404 | draft_not_found | 你的账户里没有这个 id 的样片 | 核对 gen_ id |
| 400 | not_a_draft | 这条任务不是用 draft: true 生成的,或模型不一致 | 改用样片 id 和相同的模型 |
| 409 | draft_not_ready | 样片还没有成功 | 等样片成功后再出成片 |
| 410 | draft_expired | 已超过 3 天有效期 | 重新出一条样片 |
| 409 | draft_already_finalized | 这条样片已有进行中或已成功的成片 | 用 draft.final_id 里的那条成片 |
| 503 | draft_channel_unavailable | 出样片的服务商此刻不可用 | 稍后再试 |
样片和直接出 480p 低清有什么不同?
先出一条普通 480p、再出一条 1080p,是两次互不相关的生成,即使提示词和 seed 相同,1080p 那条也可能和 480p 不一样。在 Makernice 上,只有样片能沿用样片参数出同一镜头的 1080p 版本,以保持细节结果一致。样片与普通 480p 片段价格相同,限制只有 3 天有效期和参数不可改。分辨率和时长怎么选,见 分辨率与时长怎么选。
| 项目 | 样片 | 成片 |
|---|---|---|
| 分辨率 | 只能 480p | 只能 1080p |
| 费用 | 每秒 $0.1152,即普通 480p 价 | 同样秒数按 1080p 档计价,金额以报价为准 |
| 镜头 | 按提示词和素材新生成 | 沿用样片参数出的同一镜头 |
| 参数 | 由你设置,同普通生成 | 沿用样片,不可修改 |
| 时间限制 | 3 天内可出成片 | 普通的已完成视频 |
样片和成片怎么扣费,失败了怎么办?
样片按普通 480p 生成扣费:每秒 $0.1152,一条 5 秒样片是 $0.58。成片是第二笔费用,同样的秒数按 1080p 档计价,样片费用不从中抵扣。下表按价表 v15(2026 年 11 月 11 日)计算;各档价格见 定价页。
| 时长 | 480p 样片 | 1080p 成片 | 样片加成片 |
|---|---|---|---|
| 5 秒 | $0.58 | $3.21 | $0.58 + $3.21 |
| 10 秒 | $1.15 | $6.42 | $1.15 + $6.42 |
| 15 秒 | $1.73 | $9.62 | $1.73 + $9.62 |
| 30 秒 | $3.46 | $19.25 | $3.46 + $19.25 |
成片一列用的是公开的 1080p 价。成片按出样片那家服务商的 1080p 价收费,可能高于公开价。成片报价会在冻结任何金额之前给出确切金额。其它时长可以用 视频费用计算器 估算。
样片或成片失败不扣费:冻结金额全额释放。注:如果成品因内容违规被输出审核拦截,这次生成仍会扣费。可联系客服申请人工复核。成片总是由出样片的服务商生成,不会换到别家;这家服务商出错时,成片失败,冻结金额全额释放。样片仍在有效期内时,失败的成片可以用同一样片再出一次。所有情况见 失败的生成会扣费吗?,以及 计费示例。
Seedance 2.5 样片模式什么时候省钱,什么时候不省?
一个镜头要试两次或更多时,Seedance 2.5 样片模式就省钱,因为每多试一次只花一条 480p 样片的钱,而不是一次 1080p 的钱。试 N 次时,只要 480p 每秒价低于 1080p 每秒价的 (N − 1)/N,「N 条样片 + 1 条成片」就比直接出 N 次 1080p 便宜:试 2 次要低于一半,试 3 次要低于三分之二。按公开价,480p 每秒价是 1080p 每秒价的 18%。
| 时长 | 直接出 1080p 试 3 次 | 3 次样片 + 1 次成片 |
|---|---|---|
| 5 秒 | $9.62 | $1.73 + $3.21 |
| 10 秒 | $19.25 | $3.46 + $6.42 |
| 15 秒 | $28.87 | $5.19 + $9.62 |
| 30 秒 | $57.74 | $10.38 + $19.25 |
预计一个镜头要试不止一次,就用样片模式:试得越多,省得越多。预计第一条就能用,就直接出 1080p。只试一次时,样片模式会在 1080p 价之外多花一条 480p 样片的钱。
Seedance 2.5 样片模式适合哪些项目?
Seedance 2.5 样片模式适合要试很多镜头、只留一部分的项目。常见的有三类:
- 短剧分镜:把一场戏的每个镜头都先出成样片,按顺序看一遍,只给留在剪辑里的镜头出成片。要在多个镜头里保持同一个角色,按 Seedance 2.5 多个镜头里怎么保持同一个角色 的做法用参考图。
- 产品视频:先在样片里确认产品一直在画面里、运镜停在你想要的位置,再为广告出成片。
- 提前预演:把样片发给客户或导演,先对齐构图、动作和节奏,再为 1080p 付费。
所有审片都要排在 3 天有效期内。超过 3 天的样片不能再出成片,只能重新付费出样片。
该用样片模式,还是先用 Seedance 2.0 Fast 试?
想沿用样片参数出同一镜头的 1080p 版本、保持细节结果一致,就用样片模式;只想验证提示词思路,才先用 Seedance 2.0 Fast 试。成片基于样片、沿用样片的参数生成。先用 Seedance 2.0 Fast 试、再用 Seedance 2.5 出片,是另一个模型的全新镜头,构图、动作和细节都可能变化。两代模型的区别见 Seedance 2.5 与 Seedance 2.0 对比。
| 项目 | Seedance 2.5 样片 | 先用 Seedance 2.0 Fast 试 |
|---|---|---|
| 试片价格 | 480p 每秒 $0.1152 | 720p 每秒 $0.1027 |
| 带到 1080p 的是什么 | 样片的参数,出同一镜头的 1080p 版本 | 只有提示词;Seedance 2.5 会生成新镜头 |
| 最长片段 | 30 秒 | 15 秒 |
| 期限 | 3 天内出成片 | 没有期限,提示词可以再用 |
Seedance 2.5 样片模式有哪些限制,什么时候别用?
Seedance 2.5 样片模式只支持 Seedance 2.5,成片只有 1080p,每条样片有 3 天有效期、只能成功出一次成片。完整清单:
- 只有 Seedance 2.5 支持样片,其它模型会拒绝 draft 字段。
- 成片固定 1080p,没有 4K 成片。
- 样片只在 3 天内能出成片。
- 成片不能改任何参数:提示词、素材、模式、时长、比例和 seed 全部沿用样片。
- 一条样片只能成功出一次成片;样片还在有效期内时,失败的成片可以再出一次。
- 成片只能由出样片的服务商生成。这家服务商不可用时,报价返回 503 draft_channel_unavailable,或成片失败、冻结金额全额释放。
三种情况别用样片模式:需要 4K 视频、预计第一条就能用、3 天内没法审样片。这三种情况下,直接按需要的分辨率发起普通生成更合适。
怎样用 Python 或 Node.js 跑 Seedance 2.5 样片模式?
下面的 Python 和 Node.js 脚本跑完整个样片流程:出一条 480p 样片,等它完成,存成 draft.mp4,你按回车后再出 1080p 成片。每个请求都设了超时,每次创建都带自己的 Idempotency-Key。
import os, sys, time, uuid
import requests
API = "https://api.makernice.com/v1"
H = {"Authorization": f"Bearer {os.environ['MAKERNICE_API_KEY']}"}
FINAL = ("succeeded", "failed", "canceled")
def run(job):
# Quote, create with its own Idempotency-Key, then poll until the generation ends
r = requests.post(f"{API}/generations/quote", json=job, headers=H, timeout=30)
if not r.ok:
sys.exit(f"quote {r.status_code}: {r.text}")
quote = r.json()
r = requests.post(f"{API}/generations", json={"quote_id": quote["id"], "input": job},
headers={**H, "Idempotency-Key": str(uuid.uuid4())}, timeout=30)
if not r.ok:
sys.exit(f"create {r.status_code}: {r.text}")
gen = r.json()
deadline = time.monotonic() + 30 * 60
while gen["status"] not in FINAL:
if time.monotonic() > deadline:
sys.exit(f"{gen['id']} is still {gen['status']}, poll it again later")
time.sleep(5)
r = requests.get(f"{API}/generations/{gen['id']}", headers=H, timeout=15)
r.raise_for_status()
gen = r.json()
if gen["status"] != "succeeded":
sys.exit(f"{gen['id']} {gen['status']}: {gen.get('error')}")
return gen
def download(gen, path):
video = requests.get(f"{API}/generations/{gen['id']}/outputs/0", headers=H, timeout=120)
video.raise_for_status()
with open(path, "wb") as f:
f.write(video.content)
# 1. Draft: a normal 480p request with "draft": True
draft = run({
"model": "seedance-2.5",
"mode": "t2v",
"prompt": "A red kite climbs over a windy beach at sunrise, slow tracking shot, long shadows on the sand",
"duration": 5,
"resolution": "480p",
"aspect_ratio": "16:9",
"draft": True,
})
download(draft, "draft.mp4")
input(f"Check draft.mp4 ({draft['id']}), then press Enter to make the 1080p final ")
# 2. Final: only model and from_draft, within 3 days of the draft
final = run({"model": "seedance-2.5", "from_draft": draft["id"]})
download(final, "final.mp4")
print("Saved final.mp4")Node.js 版本做同样的事,用的是 Node.js 18 及以上自带的 fetch。完整的请求与响应说明见 API 文档。
// Node.js 18 or later, saved as draft.mjs
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { createInterface } from "node:readline/promises";
const API = "https://api.makernice.com/v1";
const H = { Authorization: "Bearer " + process.env.MAKERNICE_API_KEY, "Content-Type": "application/json" };
const FINAL = new Set(["succeeded", "failed", "canceled"]);
const REQUEST_TIMEOUT_MS = 30000;
const DOWNLOAD_TIMEOUT_MS = 120000;
const POLL_INTERVAL_MS = 5000;
async function call(method, path, body, headers = {}) {
const res = await fetch(API + path, { signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
method,
headers: { ...H, ...headers },
body: body ? JSON.stringify(body) : undefined,
});
if (!res.ok) throw new Error(method + " " + path + " " + res.status + ": " + (await res.text()));
return res.json();
}
// Quote, create with its own Idempotency-Key, then poll until the generation ends
async function run(job) {
const quote = await call("POST", "/generations/quote", job);
let gen = await call("POST", "/generations", { quote_id: quote.id, input: job }, { "Idempotency-Key": randomUUID() });
const deadline = Date.now() + 30 * 60 * 1000;
while (!FINAL.has(gen.status)) {
if (Date.now() > deadline) throw new Error(gen.id + " is still " + gen.status + ", poll it again later");
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
gen = await call("GET", "/generations/" + gen.id);
}
if (gen.status !== "succeeded") throw new Error(gen.id + " " + gen.status + ": " + JSON.stringify(gen.error));
return gen;
}
async function download(gen, path) {
const res = await fetch(API + "/generations/" + gen.id + "/outputs/0", { headers: H, signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) });
if (!res.ok) throw new Error("download " + res.status);
await writeFile(path, Buffer.from(await res.arrayBuffer()));
}
// 1. Draft: a normal 480p request with "draft": true
const draft = await run({
model: "seedance-2.5",
mode: "t2v",
prompt: "A red kite climbs over a windy beach at sunrise, slow tracking shot, long shadows on the sand",
duration: 5,
resolution: "480p",
aspect_ratio: "16:9",
draft: true,
});
await download(draft, "draft.mp4");
const rl = createInterface({ input: process.stdin, output: process.stdout });
await rl.question("Check draft.mp4 (" + draft.id + "), then press Enter to make the 1080p final ");
rl.close();
// 2. Final: only model and from_draft, within 3 days of the draft
const final = await run({ model: "seedance-2.5", from_draft: draft.id });
await download(final, "final.mp4");
console.log("Saved final.mp4");这些 Seedance 2.5 样片模式的事实出自哪里?
| 事实 | 字节跳动(BytePlus 文档) | Makernice |
|---|---|---|
| 样片分辨率 | 只能 480p | 只能 480p;其它分辨率返回 400 draft_requires_480p |
| 成片分辨率 | 只能 1080p | 只能 1080p |
| 成片沿用的参数 | 提示词、参考素材、时长、比例、seed、音频和任务类型 | 模式、时长、比例、提示词、素材、seed 和 audio(generate_audio) |
| 成片可加的参数 | 返回尾帧、输出格式、水印等选项 | 不能加;除 model 和 from_draft 外多带任何字段都返回 400 |
| 样片有效期 | 14 天;2026 年 10 月 28 日之前创建的样片为 7 天 | 3 天 |
| 计费 | 样片按 480p 计费,成片按目标分辨率计费 | 样片按 480p 价,成片按 1080p 档,不抵扣 |
字节跳动的规则出自 BytePlus Seedance 2.5 文档,查阅日期 2026 年 11 月 11 日。Makernice 的规则适用于发到 Makernice 的请求,比字节跳动的规则更严格。
