P
PICOPAPA
视频生成

Seedance 2.0 最佳实践

使用 Seedance 2.0 旗舰模型进行高质量视频生成

🎬 Seedance 2.0 最佳实践

Seedance 2.0 是底层由火山引擎支持的强大的新一代视频生成模型。它能够极大限度保证生成的自然性、物理规律逻辑性。AILB 对其进行了 OpenAI API 标准化的原生封装,让你能够用极低的成本无缝调起复杂的视频生成任务。

支持模型名: doubao-seedance-2-0

场景:图文联合控制(Image-to-Video)

如果你想让某一张指定的图片动起来,且严格按照文字描述中的运镜进行。你可以按照如下方式构建 Payload。

特性支持:

  • duration: 视频长度(默认 5s,也支持较长的视频内容生成)
  • ratio: 画面分辨率比,支持 16:9, 9:16, 1:1
  • watermark: 是否需要打上 AI 生产水印 (布尔值)

请求参数体 (JSON / cURL)

请注意 content 数组的顺序,多模态模型的常规最佳实践为:先传文字提示 -> 紧接着传入多张参考图片。

curl -X POST "https://ailb.5884.cn/v1/video/generations" \
-H "Authorization: Bearer sk-your_key_here" \
-H "Content-Type: application/json" \
-d '{
  "model": "doubao-seedance-2-0",
  "prompt": "全程使用视频1的第一视角构图,全程使用音频1作为背景音乐。第一人称视角果茶宣传广告,seedance牌「苹苹安安」苹果果茶限定款;首帧为图片1,你的手摘下一颗带晨露的阿克苏红苹果,轻脆的苹果碰撞声;2-4 秒:快速切镜,你的手将苹果块投入雪克杯,加入冰块与茶底,用力摇晃,冰块碰撞声与摇晃声卡点轻快鼓点,背景音:「鲜切现摇」;4-6 秒:第一人称成品特写,分层果茶倒入透明杯,你的手轻挤奶盖在顶部铺展,在杯身贴上粉红包标,镜头拉近看奶盖与果茶的分层纹理;6-8 秒:第一人称手持举杯,你将图片2中的果茶举到镜头前(模拟递到观众面前的视角),杯身标签清晰可见,背景音「来一口鲜爽」,尾帧定格为图片2。背景声音统一为女生音色。",
  "images": [
      "https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic1.jpg",
      "https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic2.jpg"
  ],
  "metadata": {
      "video_url": "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_tea_video1.mp4",
      "audio_url": "https://ark-project.tos-cn-beijing.volces.com/doc_audio/r2v_tea_audio1.mp3",
      "duration": 5,
      "ratio": "16:9",
      "watermark": false
  }
}'
}'

高阶多模态参数透传 (覆盖网关默认装配)

如果你想发送复杂的多模态分镜序列(例如同时带有两个不同角色 reference_image 的图片并在特定时间段出现的文本),简单的 prompt + images 无法满足结构定制。你可以选择直接把底层原生的结构体通过传入 metadata.content 透传给底层大模型。

[!WARNING] 出于网关外层的拦截器为了保障基础接口的强健性,prompt 结构为必传字段,不能为空。

但要注意:如果你的 metadata 中已经包含了 content 对象,它会在底层覆盖且无视你外层所写的 prompt 内容。所以此时外层的 prompt 请保留,你可以写成 "prompt": "填写任意内容,不实际用到" 来绕过网关安全校验。

[!WARNING] 关于底层画幅控制与视频传入的重要限制(必读)

  1. 最外层的 "size": "720x1280" 仅用于通过 OpenAI 核心兼容链路的安全校验,它不会生效到火山实际生成中。真正控制火山分辨率的是 metadata.ratio(或 metadata.resolution)。
  2. 当传入 reference_video (角色参考视频) 时,目前网关资产库尚未打通对视频的 asset://ma_xxx 免鉴权协议转换。请务必在此处直接传入带有公网可访问 URL 的真实视频链接(如你自己的 COS/OSS 服务器),否则会报模型解析失败!

透传 Payload 例子:

{
  "model": "doubao-seedance-2-0",
  "prompt": "随便写点占位符不影响,因为会被底下的 content 覆盖掉",
  "metadata": {
      "duration": 15,
      "ratio": "9:16",
      "content": [
          {
              "type": "text",
              "text": "这段字才是会被火山真正采纳的分镜!..."
          },
          {
              "type": "image_url",
              "role": "reference_image",
              "image_url": { "url": "asset://ma_16" }
          },
          {
              "type": "image_url",
              "role": "reference_image",
              "image_url": { "url": "asset://ma_17" }
          }
      ]
  }
}

异步任务处理

视频生成是一项极其耗费 GPU 算力的底层操作,往往耗时高达数分钟。AILB 对原生模型进行了包装。

当我们执行完上述请求后,不会立刻返回视频本身(否则 HTTP 会一直阻塞直到超时断开),而是会立刻返回一个兼容上游规范格式的任务回执:

第 1 步:拿到响应回执

{
  "id": "chatcmpl-aigc-task-xxxx",
  "object": "chat.completion",
  "created": 1740992345,
  "model": "doubao-seedance-2-0",
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "任务已提交。请带上原请求参数并使用相同的模型,发送至同步等待接口轮询,或在任务后台查看。"
      },
      "finish_reason": "stop"
    }
  ],
  // ✨ 最重要的部分:我们把上游原生的任务ID回传给你了
  "task_id": "seedance-t-2026-xxxxx" 
}

第 2 步:轮询状态获取视频结果

获取上述响应中的 task_id 后,通过网关标准的异步查询接口 /v1/video/generations/:task_id 查询任务进度与最终的视频结果:

请求示例:cURL 方式

curl -G "https://ailb.5884.cn/v1/video/generations/seedance-t-2026-xxxxx" \
  -H "Authorization: Bearer sk-your_key_here"

请求示例:Python 方式

如果你在后端的 Python 脚本中进行轮询,这里封装了一段非常典型的轮询代码:

import time
import requests

API_KEY = 'sk-your_key_here'
TASK_ID = 'seedance-t-2026-xxxxx'
URL = f'https://ailb.5884.cn/v1/video/generations/{TASK_ID}'
HEADERS = {'Authorization': f'Bearer {API_KEY}'}

while True:
    response = requests.get(URL, headers=HEADERS)
    result = response.json()
    
    # 真实响应将被包装在 data 节点内
    status_data = result.get('data', {})
    status = status_data.get('status')
    print(f"当前任务状态: {status}")
    
    if status == 'SUCCESS':
        video_url = status_data.get('result_url')
        print(f"✅ 生成成功!视频下载链接: {video_url}")
        break
    elif status in ['FAILURE', 'FAILED', 'CANCELED']:
        print(f"❌ 任务终止,原因: {status_data.get('fail_reason', '未知错误')}")
        break
        
    # 每 5 秒轮询一次
    time.sleep(5)

第 3 步:响应体解析

当你查询到任务仍在处理中时,响应的状态码保持 200,只带有状态和进度。一旦模型生成完成,data 层内部的 status 的状态会转变为 SUCCESS

{
  "code": "success",
  "data": {
    "task_id": "seedance-t-2026-xxxxx",
    "status": "SUCCESS",
    "progress": "100%",
    "result_url": "https://cdn.example.com/videos/output-sxxx.mp4"
  }
}

此时,data.result_url 中所包含的就是你可以直接下载的、带有临时鉴权签名的 CDN 链接!

(如果你想直接让系统自己等、不要用轮询的方法:请参阅左侧底部的 【异步与同步任务最佳实践】。)

这篇文档对您有帮助吗?

最后更新于