Skip to content

视频接口

视频生成通常是异步任务:先提交生成请求,接口返回任务 ID;随后轮询任务状态;任务完成后再获取视频内容或下载地址。

接口信息

接口方法完整请求地址用途
创建视频任务POSThttps://api.gemai.cc/v1/videos提交异步视频生成任务
查询视频任务GEThttps://api.gemai.cc/v1/videos/{id}查询任务状态
获取视频内容GEThttps://api.gemai.cc/v1/videos/{id}/content获取生成后的视频内容
Seedance 豆包原生提交POSThttps://api.gemai.cc/api/v3/contents/generations/tasks提交豆包原生格式视频任务
Seedance 豆包原生查询GEThttps://api.gemai.cc/api/v3/contents/generations/tasks/{task_id}查询豆包原生格式任务状态
OpenAI 兼容视频生成POSThttps://api.gemai.cc/v1/video/generations提交 OpenAI 兼容格式视频任务
OpenAI 兼容任务查询GEThttps://api.gemai.cc/v1/video/generations/{task_id}查询 OpenAI 兼容格式任务状态

异步视频生成

提交任务

INFO

视频生成模型通常需要更长处理时间。提交任务后,请保存返回的任务 ID,后续查询和下载都要用到它。

bash
curl --location 'https://api.gemai.cc/v1/videos' \
  --header 'Authorization: Bearer sk-你的令牌' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "sora-2",
    "prompt": "一只橘猫在雨后的霓虹街道上奔跑,电影感,慢镜头",
    "size": "1280x720",
    "seconds": 5
  }'

查询任务状态

INFO

{id} 替换为提交任务后返回的任务 ID。建议每隔几秒查询一次,不要高频轮询。

bash
curl --location 'https://api.gemai.cc/v1/videos/video-task-id' \
  --header 'Authorization: Bearer sk-你的令牌'

获取视频内容

INFO

任务完成后,可以通过内容接口获取视频文件或视频下载地址。具体返回格式可能因模型而异。

bash
curl --location 'https://api.gemai.cc/v1/videos/video-task-id/content' \
  --header 'Authorization: Bearer sk-你的令牌' \
  --output output.mp4

Seedance 2.0

Seedance 2.0 相关文档已经按使用方式拆分为多个页面:

OpenAI 兼容提交示例

INFO

如果你的程序按 OpenAI 风格封装视频生成,可以使用 /v1/video/generations

bash
curl --location 'https://api.gemai.cc/v1/video/generations' \
  --header 'Authorization: Bearer sk-你的令牌' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "doubao-seedance-2-0-260128",
    "prompt": "海边日落,镜头缓慢推进,真实摄影风格",
    "seconds": "5",
    "metadata": {
      "ratio": "16:9",
      "resolution": "720p"
    }
  }'

查询兼容格式任务

bash
curl --location 'https://api.gemai.cc/v1/video/generations/task-id' \
  --header 'Authorization: Bearer sk-你的令牌'

JavaScript 轮询示例

等待任务完成

INFO

下面示例演示基本轮询逻辑。生产环境建议增加最大重试次数、错误处理和任务超时。

javascript
const apiKey = process.env.GEMAI_API_KEY

async function createVideo() {
  const response = await fetch('https://api.gemai.cc/v1/videos', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${apiKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      model: 'sora-2',
      prompt: '海边日落,镜头缓慢推进,真实摄影风格',
      size: '1280x720',
      seconds: 5,
    }),
  })

  if (!response.ok) {
    throw new Error(`创建视频任务失败:${response.status}`)
  }

  return response.json()
}

async function getVideoStatus(id) {
  const response = await fetch(`https://api.gemai.cc/v1/videos/${id}`, {
    headers: {
      Authorization: `Bearer ${apiKey}`,
    },
  })

  if (!response.ok) {
    throw new Error(`查询视频任务失败:${response.status}`)
  }

  return response.json()
}

const task = await createVideo()
const taskId = task.id || task.task_id

for (let index = 0; index < 60; index += 1) {
  const status = await getVideoStatus(taskId)

  if (status.status === 'succeeded' || status.status === 'completed') {
    console.log('视频任务已完成:', status)
    break
  }

  if (status.status === 'failed') {
    throw new Error('视频任务失败')
  }

  await new Promise((resolve) => setTimeout(resolve, 5000))
}

注意事项

  • 视频接口大多是异步任务,不要期待提交请求后立即拿到视频文件。
  • 轮询间隔建议控制在 3-10 秒,避免频繁请求。
  • 不同视频模型的参数名可能略有差异,例如 secondsdurationsizeaspect_ratio
  • 视频生成失败时,优先检查模型是否可用、提示词是否违规、余额是否充足。