api

Seedance 真人素材视频生成完整教程

直接答案使用本站令牌上传图片到 /v1/seedance/assets,主动发起 compliance 审核;等待每张图片的 status 变为 active,再把 reference 放入 /v1/videos 的 content,保存视频任务 ID 并查询到 completed 后下载。

更新 · 审核信息

使用真人素材需要管理员开通权限,请联系管理员。

1. 流程与调用前准备

真人素材建议采用可复用、可追踪的素材库流程:上传真人图片 → 发起审核 → 查询素材直到 active → 使用 asset:// 引用创建视频 → 查询视频直到 completed → 下载结果。选择素材库方式的每张图片都要分别完成上传和审核。直接传入 URL/base64 的方式及边界见 1.1 和 4.4 节。

真人素材审核与视频生成时序

本文描述本站统一接口。客户端只需要本站 Base URL、API 令牌和模型名称;素材服务由令牌对应的分组自动选择。使用前在模型广场确认模型支持 /v1/videos,令牌有对应模型权限、可用额度,且分组已开通真人素材能力。首次接入和需要稳定复用素材的业务,建议使用固定单分组令牌。

Seedance 官方说明介绍了模型的多模态能力;本文接口以本站实现为准。示例使用 doubao-seedance-2-0-260128,实际可用模型以当前令牌及模型广场为准。上传和审核不需要指定生成模型。

准备 Bash、curl、jq 和有权使用的真人照片。BASE_URL 填站点根地址,不要重复附加 /v1。在自己的终端设置环境变量,密钥不要写入公开代码:

export BASE_URL="https://api.tu-zi.com"
export API_KEY="替换为你的本站 API 令牌"
export MODEL="doubao-seedance-2-0-260128"

1.1 已审核素材与原始图片如何区分

保留相同的 type=image_url,通过 image_url.url 的前缀区分输入来源,通过 role 区分图片用途。 不需要添加真人标记,也不能由调用方声明某张图片已审核通过。

输入来源image_url.url 示例当前处理方式
素材库引用asset://0123456789abcdef0123456789abcdef校验本站素材归属、分组和 active 状态后复用,不下载或重新上传图片
图片直链https://media.example.com/scene.jpg流式下载并上传,直接使用上传 UUID 生成,不调用审核
图片 Base64data:image/png;base64,...流式解码并上传,直接使用上传 UUID 生成,不调用审核

已审核真人素材作为参考图时:

{"type": "image_url", "role": "reference_image", "image_url": {"url": "asset://0123456789abcdef0123456789abcdef"}}

普通场景图片作为参考图时:

{"type": "image_url", "role": "reference_image", "image_url": {"url": "https://media.example.com/scene.jpg"}}

两者的 role 相同,是因为都用作参考图;前缀不同,服务端处理路径就不同。asset:// 后面必须是本站上传返回的素材 ID,不能填写上游 UUID,也不能把图片地址改成这个前缀来声明审核通过。上传刚返回的引用可能仍是 pending,必须等到 active 才能生成。

输入来源不等于是否包含真人。 已审核的非真人图片也可使用 asset://;HTTP(S)/base64 图片也可能包含真人。真人素材应通过素材库显式上传、审核到 active,再复用返回的引用;直传图片不调用审核,误传真人图片被上游拒绝时返回上游错误。

生成模式与审核状态独立。 role=reference_image 默认选择 referToVideo;单图驱动画面时使用 role=first_frame 并显式指定顶层 refer_model=imageToVideo。两种用途都能使用已审核素材,不能用模式名称区分真人与非真人。首尾帧和其他模式见 4.2 节。

2. 接口与参数速查

所有接口使用 Authorization: Bearer $API_KEY。只有上传使用 multipart/form-data,curl 的 -F 会自动设置 boundary,不要手动写上传的 Content-Type。

方法路径用途
POST/v1/seedance/assets上传一张图片,创建 pending 素材
POST/v1/seedance/assets/{id}/compliance发起审核,无需请求体
GET/v1/seedance/assets/{id}读取素材及持久化审核状态
GET/v1/seedance/assets分页查询当前令牌可访问的素材
DELETE/v1/seedance/assets/{id}删除本站素材记录,使其不可再引用
POST/v1/videos提交视频生成任务,JSON 请求体
GET/v1/videos/{task_id}查询视频状态及结果
GET/v1/videos/{task_id}/content视频完成后获取内容

上传只需传入 file,每次一张图片;多个参考图需要多次调用。

参数类型必填说明
file二进制文件非空图片,最大 30 MiB(31,457,280 字节);使用 JPG、PNG、WebP、GIF、BMP 或 TIFF 图片

审核时将上传返回的素材 ID 放入请求路径,无需请求体。视频、音频参考直接在生成请求中提供文件 URL。

3. 上传图片并发起审核

curl --fail-with-body --silent --show-error --max-time 180 \
  "$BASE_URL/v1/seedance/assets" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./portrait.jpg"

上传响应的关键字段如下,示例 ID 为虚构值。先判断 success,再读取 data.iddata.reference

{
  "success": true,
  "message": "",
  "data": {
    "id": "0123456789abcdef0123456789abcdef",
    "reference": "asset://0123456789abcdef0123456789abcdef",
    "asset_type": "image",
    "status": "pending",
    "error_message": "",
    "compliance_started": false,
    "review_task_id": "",
    "retry_after": 5,
    "created_at": 1800000000,
    "updated_at": 1800000000,
    "last_polled_at": 0
  }
}

将上传返回的 data.id 放入路径,主动启动审核。{id} 只填 ID,不带 asset:// 前缀:

export ASSET_ID="替换为上传返回的 data.id"
curl --fail-with-body --silent --show-error --max-time 180 \
  -X POST "$BASE_URL/v1/seedance/assets/$ASSET_ID/compliance" \
  -H "Authorization: Bearer $API_KEY"

curl --fail-with-body --silent --show-error --max-time 60 \
  "$BASE_URL/v1/seedance/assets/$ASSET_ID" \
  -H "Authorization: Bearer $API_KEY"

发起审核和查询返回相同的素材结构。审核开始后 compliance_started=truereview_task_id 可用于在任务日志中定位记录。服务端后台继续审核,客户端断开后可用原素材 ID 恢复查询,无需重复上传。

字段或状态含义与下一步
pending未启动或审核中;结合 compliance_started 判断,尚不能生成
active审核通过,可在所属分组和当前权限范围内引用
failed审核失败或处理超时,读取 error_message,处理原因后再决定是否重新审核或换图
deleted删除接口返回的终态;后续查询通常为 404,列表不再显示
reference生成时使用的完整 asset://... 字符串,不能当作图片下载地址
retry_after建议查询间隔,当前为 5 秒,可增加随机抖动并设总时限
created_at / updated_at / last_polled_atUnix 秒时间戳;last_polled_at=0 表示尚未轮询
error_message素材处理错误说明;以 status 判断是否为终态

素材接口可能返回 HTTP 200 但 success=false,例如 {"success":false,"message":"当前令牌未配置可用素材适配器"}curl --fail-with-body 只能拦截 HTTP 错误,业务代码还必须检查 success。对 pending 只轮询 GET,不要反复 POST 审核。

3.1 真人照片在远程 URL 上时

如果照片只有网络地址,先下载为本地文件,再按本节上传和审核。下载图片时不携带本站 API 令牌:

export IMAGE_URL="https://media.example.com/portrait.jpg"
curl --fail-with-body --silent --show-error --location \
  --proto '=https' --proto-redir '=https' \
  --connect-timeout 15 --max-time 120 --max-filesize 31457280 \
  "$IMAGE_URL" --output ./portrait.jpg

替换为自己的图片直链,确认下载成功后,使用第 3 节的 -F "file=@./portrait.jpg" 上传,再发起审核。上传接口接收文件内容,不能把图片 URL 当作 file 字段的值。

4. 使用审核通过的素材生成视频

图片 URL 字段直接使用状态为 active 的素材响应中的 reference。以下示例将人物作为参考图,显式使用 refer_model=referToVideo;如果需要单图驱动的 imageToVideo,按 1.1 和 4.2 节选择用途。真人图片无需更换专用视频端点:

export ASSET_REFERENCE="asset://替换为已通过审核的素材ID"
jq -n --arg model "$MODEL" --arg ref "$ASSET_REFERENCE" '{
  model: $model,
  content: [
    {type: "text", text: "参考图中的人物自然看向镜头,用中文说:大家好,很高兴认识你,希望我们一起发现更多精彩。保持人物外貌和服装一致,口型自然。"},
    {type: "image_url", role: "reference_image", image_url: {url: $ref}}
  ],
  refer_model: "referToVideo",
  duration: 8,
  ratio: "9:16",
  resolution: "720P",
  generate_audio: true
}' > video-request.json

curl --fail-with-body --silent --show-error --max-time 180 \
  "$BASE_URL/v1/videos" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @video-request.json
参数类型本教程用法与约束
modelstring必填,使用当前令牌有权访问的 Seedance 模型
contentarray提供非空文本项及参考素材项,按预期参考顺序排列
content[].typestringtextimage_urlvideo_urlaudio_url
content[].textstring文本项提示词,明确人物动作、台词、画面、声音和各参考素材用途
content[].rolestring参考图用 reference_image,首帧/尾帧用 first_frame / last_frame,视频用 reference_video,音频用 reference_audio;文本项省略。此字段不表示真人属性或审核状态
content[].image_url.urlstring支持 HTTP(S) 图片直链、标准 data:image/<mime>;base64,... 图片或已审核的 asset://... 引用,可在同一请求中混用;直传流程与上游拒绝处理见 4.4
image / input_referencestring 或 string[]顶层图片别名,和 content[].image_url.url 复用相同的来源处理和大小限制;直传不调用审核,素材库引用须为 active;推荐使用 content 以显式表达顺序和 role
images / images_urlstring[]顶层图片数组,接受相同的 HTTP(S)、图片 data URI 和 asset://
content[].video_url.urlstring可由服务端访问的 HTTP(S) 视频地址,建议 HTTPS,不能使用图片素材 ID
content[].audio_url.urlstring可由服务端访问的 HTTP(S) 音频地址,建议 HTTPS,不能使用图片素材 ID
durationinteger视频秒数,例如 8;Seedance 2.0 系列为 4–15 秒、2.5 为 4–30 秒,省略时默认 5 秒
ratiostring示例 9:16 竖屏或 16:9 横屏;应显式指定,其他画幅以模型支持为准
resolutionstring示例和当前默认 720P,其他分辨率以所选模型支持为准
generate_audioboolean是否生成音轨,示例显式 truefalse 表示关闭,省略时当前接入默认 true
countinteger可省略;当前接入只支持 1,多次创作需分别提交任务

使用素材库引用时,必须先完成该素材的上传和审核。直接传入原始图片的流程、限制与日志差异见 4.4 节。

4.1 参数在 /v1/videos 中怎么传

生成参数放在 JSON 顶层,参考素材放在 content。除上表的常用参数外,还可以指定提示词、参考模式和输出格式:

参数类型说明
promptstring可替代 content 中的文本项;两种写法选一种,提示词不能为空
refer_modelstring指定下表中的生成模式;省略时根据素材推断
output_formatstring仅 Seedance 2.5 使用,支持 mp4mov;省略时使用默认格式

示例:顶层 prompt 的纯文本写法。填写第 1 节的环境变量后可直接调用,不需要上传图片:

jq -n --arg model "$MODEL" '{
  model: $model,
  prompt: "海边清晨,镜头缓慢推进,保持无字幕。",
  resolution: "720P",
  ratio: "16:9",
  duration: 8,
  refer_model: "textToVideo",
  generate_audio: false,
  count: 1
}' | curl --fail-with-body --silent --show-error --max-time 180 \
  "$BASE_URL/v1/videos" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @-

4.2 参考模式与分辨率范围

refer_model所需素材2.5 的附加要求
textToVideo不携带图片、视频或音频,仍提供非空提示词
referToVideo至少 1 个参考素材;2.0 系列最多 15 个,2.5 最多 50 个,同时满足各类型数量限制
imageToVideo恰好 1 张图片,不带其他媒体ratio=adaptive
firstAndLastFrame恰好 2 张图片,不带其他媒体;按首帧、尾帧顺序排列ratio=adaptive
videoExtend恰好 1 段视频,仅 Seedance 2.5 支持显式设置 refer_model=videoExtendratio=adaptiveduration 为 4–30 秒

模式值区分大小写。省略模式时:无素材为文生视频;单张无参考角色的图片为图生视频;两张无参考角色的图片为首尾帧;带 reference_* 角色或音视频素材时为参考生成。多参考图建议显式使用 refer_model=referToVideorole=reference_image

视频延展必须显式设置 refer_model=videoExtend;单段视频配合 role=reference_video 并不会自动选择延展。上游提供的 videoEditcount=2/4 尚未接入本站;本站当前只支持 count=1

分辨率和画幅按所选模型填写:

模型系列resolution 候选值其他边界
Seedance 2.5480P720P1080Padaptive21:916:94:31:13:49:16;可传 output_format
Seedance 2.0480P720P1080P4KSUPER_720PSUPER_1080PSUPER_4K画幅为 21:916:94:31:13:49:16
Seedance 2.0 Fast / Mini480P720PSUPER_720PSUPER_1080PSUPER_4K与 2.0 相同的画幅;SUPER_* 表示超分辨率输出

默认分辨率为 720P;默认画幅在 2.0 系列为 16:9,2.5 为 adaptive。高分辨率和超分辨率需所在分组开通支持。

4.3 2.5 单图、首尾帧与输出格式示例

以下 JSON 展示单张真人图片、无音频、MOV 输出的组合。同分组、素材服务配置未变更时,可复用前面已审核的素材;生成前确认令牌有目标模型权限。

{
  "model": "doubao-seedance-2-5-260628",
  "prompt": "参考图中的人物自然微笑并向镜头挥手,保持外貌一致。",
  "content": [
    {"type": "image_url", "role": "first_frame", "image_url": {"url": "asset://0123456789abcdef0123456789abcdef"}}
  ],
  "refer_model": "imageToVideo",
  "resolution": "720P",
  "ratio": "adaptive",
  "duration": 8,
  "generate_audio": false,
  "output_format": "mov",
  "count": 1
}

首尾帧则用以下请求,按数组顺序放首帧和尾帧,两张都要完成审核:

{
  "model": "doubao-seedance-2-5-260628",
  "prompt": "从首帧自然过渡到尾帧,保持人物身份与服装一致。",
  "content": [
    {"type": "image_url", "role": "first_frame", "image_url": {"url": "asset://0123456789abcdef0123456789abcdef"}},
    {"type": "image_url", "role": "last_frame", "image_url": {"url": "asset://fedcba9876543210fedcba9876543210"}}
  ],
  "refer_model": "firstAndLastFrame",
  "resolution": "720P",
  "ratio": "adaptive",
  "duration": 8,
  "generate_audio": false,
  "output_format": "mp4",
  "count": 1
}

将任一 JSON 保存为 video-request.json 后,使用第 4 节的 curl --data-binary @video-request.json 提交,再用第 5 节查询和下载;MOV 输出保存为 .mov。不要把所有示例参数机械合并,也不要把输出格式字段用于 2.0 系列。

4.4 普通图片 URL 与混合引用

image_url.url 也支持普通 HTTP(S) 图片直链。以下是直接传 URL 的完整调用示例;请替换为服务端可以直接下载的图片文件地址:

export IMAGE_URL="https://media.example.com/scene.jpg"
jq -n --arg model "$MODEL" --arg image "$IMAGE_URL" '{
  model: $model,
  content: [
    {type: "text", text: "参考图片中的场景,镜头缓慢推进,保持自然光影。"},
    {type: "image_url", role: "reference_image", image_url: {url: $image}}
  ],
  duration: 8,
  ratio: "16:9",
  resolution: "720P",
  generate_audio: true
}' | curl --fail-with-body --silent --show-error --max-time 180 \
  "$BASE_URL/v1/videos" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @-

普通图片直传不调用合规审核。 网关流式下载或解码并上传图片,使用上传返回的 UUID 提交生成,不调用 /openapi/assetLibrary/compliance/check,也不等待审核状态。URL/base64 只是输入来源,不能据此判断图片是否包含真人;真人图片请先通过素材库审核,再使用 asset://。如果误传真人图片导致上游拒绝,接口返回上游错误;异步拒绝会出现在视频任务失败原因中。

直传方式不会创建本站素材记录或 review_task_id,没有独立的“素材审核”任务,也不会在本次请求超时后后台续接。需要复用素材、等待较长审核或保留审核记录时,按第 3 节显式上传并审核,再使用 asset://。保留 Request-ID,检查提交错误或异步任务失败原因;创建视频返回成功只代表任务已受理,仍需查询到 completed

如果素材下载、类型校验、上传或请求体构建失败,视频任务可能尚未创建,但网关仍会写入一条零额度错误使用日志。使用 /log/get-request?id=<Request-ID> 可查询脱敏后的具体原因;这类失败不会产生视频计费。

下面是直接提交图片 data URI 的完整 JSON。示例中的 iVBORw0KGgo... 仅表示一张标准 PNG 的 Base64 内容,实际请求必须替换为完整编码:

{
  "model": "doubao-seedance-2-0-260128",
  "content": [
    {"type": "text", "text": "保持参考图主体完整,只做轻微镜头推进和自然光影变化。"},
    {"type": "image_url", "role": "reference_image", "image_url": {"url": "data:image/png;base64,iVBORw0KGgo..."}}
  ],
  "duration": 4,
  "ratio": "16:9",
  "resolution": "480P",
  "generate_audio": false
}

只接受带 MIME 前缀的图片 data URI:data:image/png;base64,...data:image/jpeg;base64,... 等。裸 Base64(没有 data:image/...;base64, 前缀)以及 data:video/...data:audio/... 均不支持。网关流式解码并直接上传,不把解码结果落盘;解码后的单张图片最多 30 MiB,同时受 MAX_FILE_DOWNLOAD_MB、单请求远程素材总预算和 /v1/videos 入口请求体上限约束。Base64 编码本身会增大入口请求体,因此小于 30 MiB 的解码结果也可能先触发入口体积限制。

同一次请求中,可以将已审核的人物素材和普通场景图片 URL 组合使用。下面 JSON 作为第 4 节的请求体:人物引用复用已审核 UUID,场景 URL 上传并检查到 ACTIVE 后使用其 UUID;上游仍可能在提交或生成阶段拒绝素材。

{
  "model": "doubao-seedance-2-0-260128",
  "content": [
    {"type": "text", "text": "第一张图中的人物在第二张图的场景中自然行走,保持人物外貌一致。"},
    {"type": "image_url", "role": "reference_image", "image_url": {"url": "asset://0123456789abcdef0123456789abcdef"}},
    {"type": "image_url", "role": "reference_image", "image_url": {"url": "https://media.example.com/scene.jpg"}}
  ],
  "duration": 8,
  "ratio": "16:9",
  "resolution": "720P",
  "generate_audio": true
}

URL 不能是网页地址、Markdown 链接或需要登录的地址;不能携带本站 API 令牌。顶层 imageimagesimages_urlinput_referencecontent[].image_url.url 的图片值都走同一条处理路径。请确保链接在请求处理期间有效,且符合站点下载策略和 30 MiB 单图限制;data URI 则还要预留 Base64 编码带来的请求体开销。提交成功后的任务查询与下载仍按第 5 节操作。

4.5 Seedance 2.5 视频延展

使用已有视频继续创作时,选择 Seedance 2.5 并显式传入 refer_model=videoExtend。先设置第 1 节的 BASE_URLAPI_KEY,再将 VIDEO_URL 替换为服务端可直接下载的 HTTPS 视频文件地址:

export VIDEO_URL="https://media.example.com/source.mp4"
jq -n --arg video "$VIDEO_URL" '{
  model: "doubao-seedance-2-5-260628",
  content: [
    {type: "text", text: "延续视频中的场景和主体动作,镜头平稳推进,保持画面风格一致。"},
    {type: "video_url", role: "reference_video", video_url: {url: $video}}
  ],
  refer_model: "videoExtend",
  ratio: "adaptive",
  duration: 5,
  resolution: "480P",
  generate_audio: false,
  output_format: "mp4",
  count: 1
}' | curl --fail-with-body --silent --show-error --max-time 180 \
  "$BASE_URL/v1/videos" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @-

本站要求此模式的视频数量恰好为 1、ratio=adaptiveduration 为 4–30 秒;负数(包括 -1)会被拒绝。示例中的 duration=5 是本次生成参数,不据此承诺结果已将原视频和新增内容拼接。图片素材 asset://、裸 Base64 和视频 data URI 均不能作为延展视频输入。省略 refer_model 时仍按 referToVideo 处理。

下表是上游对输入视频的要求,不代表网关已经在本地逐项探测并校验媒体属性:

项目上游要求
格式与文件大小MP4 或 MOV,单段不超过 200 MiB
时长与帧率1–31 秒,不超过 60 fps
宽和高各为 300–6000 像素
像素面积宽 × 高为 409600–8295044
宽高比2:5–5:2

实际可下载大小还受站点 MAX_FILE_DOWNLOAD_MB 和单请求素材总预算限制,站点配置可能小于 200 MiB。提交成功后,保存返回的 idtask_id,按第 5 节查询到 completed 后下载;提交受理不代表生成已经完成。

5. 查询生成任务并下载

视频响应与素材响应不同:视频字段位于顶层,没有 data 包装。创建响应示例:

{
  "id": "task_example_video",
  "task_id": "task_example_video",
  "object": "video",
  "model": "doubao-seedance-2-0-260128",
  "status": "queued",
  "progress": 0,
  "created_at": 0
}
export VIDEO_TASK_ID="替换为创建响应的 id 或 task_id"
curl --fail-with-body --silent --show-error --max-time 60 \
  "$BASE_URL/v1/videos/$VIDEO_TASK_ID" \
  -H "Authorization: Bearer $API_KEY"

queued 表示排队,in_progress 表示生成中,completed 表示成功,failed 表示失败。progress 为进度值,不能单独当作成功依据。初次提交响应的 created_at 可能为 0,后续查询以持久化任务信息为准。完成时可取得 video_urlcompleted_at 等字段;失败时检查响应中的 error(若返回)及任务日志。审核的 active、任务日志的 SUCCESS 和视频 API 的 completed 属于不同状态体系。

只在 completed 后下载,保存到文件而不是把二进制输出到终端:

curl --fail-with-body --silent --show-error --location \
  --max-time 300 --max-filesize 536870912 \
  "$BASE_URL/v1/videos/$VIDEO_TASK_ID/content" \
  -H "Authorization: Bearer $API_KEY" \
  --output self-introduction.mp4

也可下载响应中的 video_url;下载外部媒体地址时不要附加本站 API 令牌。结果地址可能过期,请及时保存。创建请求超时不等于任务未受理,应先查看任务日志或已保存的任务 ID,避免重复提交及重复费用。

6. 可直接执行的单图与多图完整脚本

下面脚本串起上传、审核、生成、查询和下载,默认使用当前目录的 portrait.jpg。如需多图,把 IMAGES 改为多个文件路径;脚本逐张上传,全部通过审核后仅提交一次视频任务。先设置第 1 节的三个环境变量;脚本输出的 JSON 是业务记录,包含素材 ID、审核任务 ID 和视频任务 ID,应放在私有目录。

#!/usr/bin/env bash
set -euo pipefail
umask 077
: "${BASE_URL:?Set BASE_URL first}"
: "${API_KEY:?Set API_KEY first}"
: "${MODEL:?Set MODEL first}"
BASE_URL="${BASE_URL%/}"
IMAGES=("./portrait.jpg")
# Multiple references: IMAGES=("./front.jpg" "./side.jpg")
for image in "${IMAGES[@]}"; do test -f "$image"; done
WORK_DIR=$(mktemp -d "./seedance-run.XXXXXX")
printf 'Records: %s\n' "$WORK_DIR"

api() {
  curl --fail-with-body --silent --show-error \
    --connect-timeout 15 --max-time 180 \
    -H "Authorization: Bearer $API_KEY" "$@"
}
asset_ok() {
  jq -e '.success == true and (.data | type == "object")' "$1" >/dev/null || {
    jq '{success, message}' "$1" >&2
    return 1
  }
}
printf '[]\n' > "$WORK_DIR/references.json"
index=0
for image in "${IMAGES[@]}"; do
  index=$((index + 1))
  record="$WORK_DIR/asset-$index.json"
  api "$BASE_URL/v1/seedance/assets" \
    -F "file=@$image" > "$record"
  asset_ok "$record"
  asset_id=$(jq -er '.data.id | select(type == "string" and length > 0)' "$record")
  printf 'Asset: %s\n' "$asset_id"
  api -X POST "$BASE_URL/v1/seedance/assets/$asset_id/compliance" \
    > "$WORK_DIR/review-$index.json"
  asset_ok "$WORK_DIR/review-$index.json"
  jq -r '.data.review_task_id' "$WORK_DIR/review-$index.json"
  deadline=$((SECONDS + 1800))
  while true; do
    api "$BASE_URL/v1/seedance/assets/$asset_id" > "$record"
    asset_ok "$record"
    state=$(jq -r '.data.status' "$record")
    case "$state" in
      active) break ;;
      failed|deleted) jq '.data | {id, status, error_message, review_task_id}' "$record" >&2; exit 1 ;;
      pending) ;;
      *) printf 'Unknown asset state: %s\n' "$state" >&2; exit 1 ;;
    esac
    if (( SECONDS >= deadline )); then
      printf 'Review wait timed out; resume GET for %s\n' "$asset_id" >&2
      exit 1
    fi
    sleep $((5 + RANDOM % 3))
  done
  reference=$(jq -er '.data.reference' "$record")
  jq --arg ref "$reference" '. + [$ref]' "$WORK_DIR/references.json" \
    > "$WORK_DIR/references.next.json"
  mv "$WORK_DIR/references.next.json" "$WORK_DIR/references.json"
done

jq -n --arg model "$MODEL" --slurpfile refs "$WORK_DIR/references.json" '{
  model: $model,
  content: ([{type: "text", text: "参考图中的同一人物自然看向镜头,用中文说:大家好,很高兴认识你,希望我们一起发现更多精彩。保持外貌和服装一致,口型自然。"}]
    + ($refs[0] | map({type: "image_url", role: "reference_image", image_url: {url: .}}))),
  duration: 8, ratio: "9:16", resolution: "720P", generate_audio: true
}' > "$WORK_DIR/video-request.json"
api "$BASE_URL/v1/videos" -H "Content-Type: application/json" \
  --data-binary "@$WORK_DIR/video-request.json" > "$WORK_DIR/video-submit.json"
task_id=$(jq -er 'select(.error == null and .success != false) | (.id // .task_id) | select(type == "string" and length > 0)' "$WORK_DIR/video-submit.json")
printf 'Video task: %s\n' "$task_id"
deadline=$((SECONDS + 1800))
while true; do
  api "$BASE_URL/v1/videos/$task_id" > "$WORK_DIR/video-status.json"
  state=$(jq -er 'select(.error == null or .status == "failed") | .status' "$WORK_DIR/video-status.json")
  case "$state" in
    completed) break ;;
    failed) jq '{id, status, error}' "$WORK_DIR/video-status.json" >&2; exit 1 ;;
    queued|in_progress) ;;
    *) printf 'Unknown video state: %s\n' "$state" >&2; exit 1 ;;
  esac
  if (( SECONDS >= deadline )); then
    printf 'Video wait timed out; resume GET for %s\n' "$task_id" >&2
    exit 1
  fi
  sleep $((5 + RANDOM % 6))
done
api --location --max-time 300 --max-filesize 536870912 \
  "$BASE_URL/v1/videos/$task_id/content" \
  --output "$WORK_DIR/video.mp4.part"
mv "$WORK_DIR/video.mp4.part" "$WORK_DIR/video.mp4"
printf 'Completed: %s/video.mp4\n' "$WORK_DIR"

脚本遇到 HTTP 错误、业务错误、审核失败或超时会停止,不会自动重发创建请求。脚本的 30 分钟等待上限只是客户端策略,不是完成时限承诺;超时后保留记录,用原 ID 继续查询。遇到 429Retry-After 等待,恢复 GET 查询,不要为了恢复进度从头运行上传和生成。

7. 多图与音视频混合参考

通过素材库上传并发起审核的每张图片都有独立的 idreferencereview_task_id;直接传 URL/base64 不返回这些本地标识。两张参考图也要显式写 role=reference_image:省略 role 时,当前接入可能把两张图片识别为首尾帧。提示词中说明“第一张图用于人物、第二张图用于服装或场景”;多人物时明确各自的位置与动作,避免描述冲突。

本流程当前对 Seedance 2.0 接入最多接受 9 张图、3 段视频、3 段音频;2.5 接入分别为 30、10、10。实际组合还受模型、文件大小及分组能力约束,这些上限不是任意组合均能成功的保证。

参考视频使用 MP4 或 MOV,音频使用 MP3 或 WAV。单张图片最多 30 MiB,2.0 Mini 的参考图片合计不超过 64 MiB;参考音频最多 15 MiB。2.0 系列单段参考视频最多 50 MiB,2.5 最多 200 MiB,还受站点下载上限约束。同一请求的远程素材默认累计上限为 200 MiB;已审核的 asset:// 图片不占这项下载预算。请使用符合目标模型要求的图片尺寸、视频帧率及媒体时长。

保留两张已审核图片,并追加视频和音频参考时,请求结构如下。示例地址和素材 ID 均须替换;纯图片场景直接删除两个音视频项。URL 应是媒体文件地址,不能是网页地址或 Markdown 链接:

{
  "model": "doubao-seedance-2-0-260128",
  "content": [
    {"type": "text", "text": "以第一张图的人物为主角,参考第二张图的服装与场景,参考视频的舞蹈动作及音频节奏,人物在舞台中央自然跳舞,镜头缓慢推进。"},
    {"type": "image_url", "role": "reference_image", "image_url": {"url": "asset://0123456789abcdef0123456789abcdef"}},
    {"type": "image_url", "role": "reference_image", "image_url": {"url": "asset://fedcba9876543210fedcba9876543210"}},
    {"type": "video_url", "role": "reference_video", "video_url": {"url": "https://media.example.com/dance.mp4"}},
    {"type": "audio_url", "role": "reference_audio", "audio_url": {"url": "https://media.example.com/music.mp3"}}
  ],
  "duration": 8,
  "ratio": "16:9",
  "resolution": "720P",
  "generate_audio": true
}

将此 JSON 作为 POST /v1/videos 请求体,之后仍按第 5 节查询。generate_audio=true 是输出音轨开关,不要求提供参考音频,也不保证精确复刻音色。

8. 素材列表、复用与删除

curl --fail-with-body --silent --show-error --get \
  "$BASE_URL/v1/seedance/assets" \
  -H "Authorization: Bearer $API_KEY" \
  --data-urlencode "status=active" \
  --data-urlencode "page=1" --data-urlencode "size=20"

# Delete only when this reference is no longer needed.
curl --fail-with-body --silent --show-error \
  -X DELETE "$BASE_URL/v1/seedance/assets/$ASSET_ID" \
  -H "Authorization: Bearer $API_KEY"
列表参数默认值说明
status不筛选可选,通常填 pendingactivefailed
page1从 1 开始的正整数
size20正整数,最多 100

列表返回 data.itemsdata.totaldata.pagedata.size。素材对象结构与详情一致。删除成功返回 {"success":true,"message":"","data":{"id":"素材ID","status":"deleted"}};删除不代表已生成的视频被取消或所有外部存储副本被物理清除。

素材属于上传账户,并受当前令牌的分组权限限制。已审核素材可跨该分组支持的 Seedance 型号复用,生成时校验目标模型权限。素材绑定分组必须等于本次生成最终选择的分组;多分组令牌建议改用固定单分组令牌,以便稳定复用。素材服务配置更换或权限撤销后,可能需要重新上传审核。

9. 审核日志、素材 UUID 与错误排查

使用素材库方式并主动发起审核后,打开任务日志,在类型筛选中选择“素材审核”,在任务 ID 筛选中填写素材响应的 review_task_id,即可定位对应审核记录。直接传 URL/base64 不调用审核,因此没有独立审核任务;请保留生成请求的 Request-ID,以及成功受理后的视频任务 ID,通过提交错误或视频任务失败原因排查上游拒绝。

任务日志中的“素材审核”记录会保存审核任务 ID、状态、模型、素材 ID 和 asset:// 引用。管理员诊断可查看上游素材 UUID 及审核状态;普通调用方只需持久化以下关联:业务记录 → 素材 id/referencereview_task_id → 视频 id/task_id。不要用审核任务 ID 调用视频查询接口,也不要把管理员诊断中的上游 UUID 拼成本站素材引用。

现象或错误处理方式
HTTP 200 但 success=false素材业务失败,读取 message,不要继续生成
当前令牌未配置可用素材适配器确认令牌分组已开通素材能力,由管理员处理配置
pendingcompliance_started=false尚未启动审核,调用一次 compliance
审核 failed根据 error_message 更换图片或处理服务问题;不要无限重试
素材不属于当前生成分组检查上传与视频实际路由,使用稳定单分组令牌并按需重新上传
素材配置绑定失效在当前配置下重新上传、审核
401 / 403检查令牌有效性、账户和模型权限
404检查使用的是素材 ID 还是视频任务 ID,以及所属账户、当前权限和删除状态
429遵循 Retry-After,降低上传、提交或轮询频率
图片过大或内容格式无效单文件控制在 30 MiB 内,检查真实图片格式,不能只改扩展名
视频创建报配置或计费规则错误保留脱敏错误和 Request-ID 联系管理员

遇到不确定的提交结果,优先查询已有任务,记录响应中的 Request-ID 供排查。图片审核通过只代表素材可用,视频提示词和生成结果仍可能审核失败。更多异步处理和错误说明见视频任务 API异步任务指南排障指南

适用场景

  • 将审核通过的真人照片生成口播或自我介绍视频
  • 复用多张人物参考图并组合视频、音频参考
  • 查询审核日志、素材标识和视频生成结果

API 协议

  • /v1/seedance/assets
  • /v1/seedance/assets/{id}
  • /v1/seedance/assets/{id}/compliance
  • /v1/videos
  • /v1/videos/{task_id}
  • /v1/videos/{task_id}/content

FAQ

已上传图片,为什么还不能生成视频?

上传成功只表示创建了 pending 素材。必须调用 POST /v1/seedance/assets/{id}/compliance,再查询到 status=active。GET 查询和列表接口不会自动启动审核。

多张参考图需要怎么处理?

素材库图片分别上传和审核到 active 后,用返回的 asset:// 引用逐项放入 content,type=image_url、role=reference_image;普通图片也可直接传 HTTP(S) URL 或图片 data URI。已审核引用必须属于本次生成的分组,并在当前令牌权限范围内。

图片可以直接填写普通 URL 吗?

可以,content[].image_url.url 支持 HTTP(S) 图片直链和 data:image/...;base64,... 图片,也可与 asset:// 引用混用。网关流式下载或解码并上传图片,直接使用上传 UUID 生成,不调用合规审核。真人图片请先通过素材库审核,再使用 asset://;误传真人图片被上游拒绝时返回上游错误。裸 base64 和视频/音频 data URI 不支持。

真人审核素材与普通参考图需要不同的 type 或 role 吗?

不需要。type=image_url 表示图片,image_url.url 的 asset:// 前缀表示本站素材引用,HTTP(S) 或 data URI 表示原始图片输入;是否已审核由服务端记录决定。role 只表示参考图、首帧或尾帧用途,不表示真人或审核状态。已审核的非真人图片也可使用 asset://,真人照片的 URL 也不会自动变成已审核引用。

素材 ID、审核任务 ID 和视频任务 ID 是同一个吗?

不是。素材 id 用来查询或删除,reference 用来生成,review_task_id 用来追踪审核日志,视频创建响应的 id 或 task_id 用来查询视频。管理员可在审核任务诊断中查看上游素材 UUID,调用方无需使用它。

可以把一张审核通过的图用于另一个模型或分组吗?

同分组、素材服务配置未变更时,已审核图片可以用于该分组支持的其他 Seedance 型号,生成时需有目标模型权限。跨分组引用会被拒绝;建议使用固定单分组令牌。

Seedance 2.5 怎么做视频延展?

使用 /v1/videos,显式设置 refer_model=videoExtend、ratio=adaptive,提供恰好一个 type=video_url 的视频直链,duration 为 4 到 30 秒。省略 refer_model 时,视频输入仍按 referToVideo 参考生成,不会自动延展。视频不能使用图片 asset:// 或 base64。本站只接入 count=1,尚未接入上游的 videoEdit 和 count=2/4,完整示例见 4.5 节。

官方来源

  1. ByteDance Seedance 2.0 模型说明 Official
  2. 兔子 API 视频生成任务协议 Official