Makernice
← 全部文章
深色桌面上,左边一张放在玻璃放大镜下的舞者小照片,右边是同一画面的大幅清晰照片,中间连着一道琥珀色细光指南

在 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 成片」按钮在样片的卡片和详情抽屉里。只有已成功、未过期、且还没有进行中或已成功成片的样片才显示这个按钮。点击后先报价,确认框会写明报价金额、「参数沿用样片,不可修改」和到期时间。

黏土风格示意图:一张模糊的小风景卡片旁边放着放大镜,一个箭头指向同一风景的大幅清晰卡片,旁边有一个小沙漏
先用 480p 样片确认镜头,再把同一镜头出成 1080p。

出成片的请求在报价时就会检查。任何一项检查不通过,报价都会被拒:不建任务,也不冻结金额。

HTTP 状态错误码含义怎么办
404draft_not_found你的账户里没有这个 id 的样片核对 gen_ id
400not_a_draft这条任务不是用 draft: true 生成的,或模型不一致改用样片 id 和相同的模型
409draft_not_ready样片还没有成功等样片成功后再出成片
410draft_expired已超过 3 天有效期重新出一条样片
409draft_already_finalized这条样片已有进行中或已成功的成片用 draft.final_id 里的那条成片
503draft_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.1152720p 每秒 $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 的请求,比字节跳动的规则更严格。

常见问题

Seedance 2.5 样片免费吗?
不免费。Seedance 2.5 样片与普通 480p 片段价格相同,1080p 成片另收一次费用。
Makernice 上的 Seedance 2.5 样片有效期多久?
3 天,准确截止时刻以 draft.expires_at 或卡片上的剩余时间为准。过期后出成片的请求返回 410 draft_expired,不建任务,也不冻结金额,需要重新出一条样片。
Seedance 2.0 支持样片模式吗?
不支持。在 Makernice 上只有 Seedance 2.5 支持样片模式,Seedance 2.0、Seedance 2.0 Fast 和其它模型都会拒绝 draft 字段。
Seedance 2.5 样片能出 4K 吗?
不能。成片固定 1080p。需要 4K 的 Seedance 2.5 视频,请直接发起一次普通的 4K 生成。
出 Seedance 2.5 成片时能改提示词或时长吗?
不能。成片沿用样片的模式、时长、比例、提示词、素材和 seed。成片请求里除 model 和 from_draft 之外多带任何字段,都会以 400 错误被拒。
Seedance 2.5 样片的费用会从成片里抵扣吗?
不会。样片和成片是两笔独立的费用,成片报价显示的是成片的全额。
一条 Seedance 2.5 样片能出多次成片吗?
一条样片只能成功出一次成片。成片失败时,只要样片还在有效期内,可以用同一样片再出一次。
Seedance 2.5 成片失败了,钱怎么办?
成片失败不扣费:冻结金额全额释放。注:如果成品因内容违规被输出审核拦截,这次生成仍会扣费。可联系客服申请人工复核。样片还在有效期内时,可以用同一样片再出一次成片。
Seedance 2.5 样片快过期时 Makernice 会提醒吗?
登录后在网页工具里出的样片会提醒。这类样片还没出成片时,站内铃铛会在到期前 24 小时提醒你;只有在设置里打开了「生成完成时给我发邮件」,才会同时发邮件。通过 API 出的样片不提醒,请自己看 draft.expires_at。

本文涉及的模型