视频生成 (sora系列)
七牛云 AI 大模型推理 API 支持 OpenAI Sora 2 模型的视频生成功能,包括文生视频(Text-to-Video)、图生视频(Image-to-Video)和视频 Remix,兼容 OpenAI Videos API 接口格式,方便您集成到各种业务和应用场景中。
Sora-2 模型核心特点
- 高清分辨率: 仅支持 720P 高清视频输出
- 灵活时长: 支持生成 4秒、8秒 或 12秒 视频
- 多种生成方式:
- 文生视频 (Text-to-Video): 根据文本描述生成视频
- 图生视频 (Image-to-Video): 基于参考图片生成动态视频,仅支持一个参考图片
- 视频 Remix: 基于已生成视频使用新提示词重新生成
- 有声视频: 生成的视频是有声音的
接口说明
Token API 接入点
七牛云 AI 大模型推理 API 接入域名:
- 接入点:
https://api.qnaigc.com/v1 - 使用前提:获取 API KEY(API 密钥)
支持接口列表
| 接口名 | 说明 |
|---|---|
| /videos | 视频创建接口,支持文生视频(根据文本描述生成视频)和图生视频(根据参考图片和文本描述生成视频) |
| /videos/:id | 查询视频生成状态接口,根据视频任务 ID 查询生成进度和结果 |
| /videos/:id/remix | 视频 Remix 接口,基于已生成的视频使用新的提示词重新生成,保持原视频的时长和分辨率 |
支持的模型
| 模型 ID | 模型名称 | 说明 | 状态 |
|---|---|---|---|
| sora-2 | OpenAI Sora 2 | OpenAI 的视频生成模型,支持高质量文生视频和图生视频,输出分辨率为 720P | ✅ 已上线 |
| sora-2-pro | OpenAI Sora 2 Pro | OpenAI Sora 2 专业版,支持更高质量的视频生成 | 🔄 即将上线 |
请求参数说明
创建视频接口 (POST /videos)
接口说明: 创建视频生成任务,提交后会返回任务 ID,您需要使用查询接口轮询任务状态并获取生成的视频。
Header 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| Authorization | string | 是 | API Key,格式:Bearer YOUR_API_KEY |
| Content-Type | string | 是 | 请求内容类型,固定值:application/json |
Body 参数 (JSON)
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| model | string | 是 | - | 视频生成模型名称,固定为:sora-2详细说明: • 固定为 sora-2(OpenAI Sora 2 模型) |
| prompt | string | 是 | - | 视频生成的文本描述提示词,最大 2500 字符 详细说明: • 字符数限制:不超过 2500 个字符 • 建议:提示词越详细、具体,生成的视频质量越好 • 建议包含:场景描述、动作、风格、光线、氛围等细节 • 示例: "一只橘色的猫坐在窗台上,温暖的阳光洒在它身上,它慢慢转头看向镜头,电影风格,高清画质" |
| input_reference | string | 否 | - | 参考图片 URL,用于图生视频功能,必须是公开可访问的图片 URL 详细说明: • 必须提供公开可访问的图片 URL • 仅支持图片 URL,不支持 Base64 编码或其他格式 • 图片将作为视频生成的视觉参考基础,结合 prompt 描述生成动态视频 • 重要:图片尺寸必须与 size 参数一致,例如:如果 size 为 1280x720(横屏),图片尺寸也必须是 1280x720• 注意:图片必须可以通过 HTTP/HTTPS 公开访问 |
| seconds | string | 否 | 4 | 视频时长(秒),可选值:4、8、12详细说明: • 控制生成视频的时长(单位:秒) • 不同时长会影响生成成本和时间 |
| size | string | 否 | 720x1280 | 视频分辨率,格式:宽x高可选值: 1280x720(横屏)、720x1280(竖屏)详细说明: • 指定生成视频的分辨率,格式为 宽x高• 作用:主要用于判断横竖屏方向 - 宽 > 高:横屏 - 宽 < 高:竖屏 |
响应体说明
创建视频任务成功后,接口会立即返回任务基本信息。接口返回已创建的视频任务基本信息,包含任务 ID、模型、状态等字段。视频尚未生成完成,需要通过查询接口获取最终结果。响应体包含以下字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | string | 视频任务唯一 ID,用于后续查询任务状态 |
| object | string | 对象类型,固定为 video |
| model | string | 使用的模型名称,例如 sora-2 |
| status | string | 任务状态,通常为 queued(排队中) |
| created_at | integer | 创建时间(Unix 时间戳,秒) |
| updated_at | integer | 更新时间(Unix 时间戳,秒) |
响应示例:
{
"id": "qvideo-user123-1766453713089395279",
"object": "video",
"model": "sora-2",
"status": "queued",
"created_at": 1766453713,
"updated_at": 1766453713,
"seconds": "4",
"size": "1280x720"
}
查询视频状态接口 (GET /videos/:id)
接口说明: 根据视频任务 ID 查询视频生成状态和结果,建议定期轮询直到状态变为 completed 或 failed。
Path 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 视频任务 ID,创建视频时返回的 id 字段,例如:qvideo-user123-1234567890123456789 |
Header 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| Authorization | string | 是 | API Key,格式:Bearer YOUR_API_KEY |
响应体说明
根据任务状态不同,返回的字段也有所不同。任务完成后会包含 task_result 字段,其中包含生成的视频下载链接。
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | string | 视频任务唯一 ID |
| object | string | 对象类型,固定为 video |
| model | string | 使用的模型名称 |
| status | string | 任务状态,见下方状态说明 |
| created_at | integer | 创建时间 (Unix 时间戳,秒) |
| updated_at | integer | 更新时间 (Unix 时间戳,秒) |
| completed_at | integer | 完成时间 (Unix 时间戳,秒),仅在已完成或失败时返回 |
| seconds | string | 视频时长 (秒) |
| size | string | 视频分辨率 (宽 x 高) |
| task_result | object | 任务结果,包含生成的视频列表,仅在已完成时返回 |
| task_result.videos | array | 生成的视频列表 |
| task_result.videos[].id | string | 视频 ID,全局唯一 |
| task_result.videos[].url | string | 视频下载 URL(注意:生成的视频会在 7 天后过期,请及时转存) |
| task_result.videos[].duration | string | 视频时长 (秒) |
| error | object | 错误信息,仅在失败时返回 |
| error.code | string | 错误码 |
| error.message | string | 错误描述 |
任务状态说明
| 状态值 | 说明 |
|---|---|
| initializing | 初始化中,任务已创建 |
| queued | 排队中,等待处理 |
| in_progress | 处理中,模型正在生成视频 |
| downloading | 下载中,正在下载结果 |
| uploading | 上传中,正在上传到七牛云存储 |
| completed | 已完成,视频生成成功 |
| failed | 失败,视频生成失败 |
| cancelled | 已取消,用户主动取消 |
响应示例
处理中状态
{
"id": "qvideo-root-1766453713089395279",
"object": "video",
"model": "sora-2",
"status": "in_progress",
"created_at": 1766453713,
"updated_at": 1766453713,
"seconds": "4",
"size": "1280x720"
}
成功完成状态
{
"id": "qvideo-user123-1766453713089395279",
"object": "video",
"model": "sora-2",
"status": "completed",
"created_at": 1766453713,
"updated_at": 1766453836,
"completed_at": 1766453836,
"seconds": "4",
"size": "1280x720",
"task_result": {
"videos": [
{
"id": "qvideo-user123-1766453713089395279-1",
"url": "https://aitoken-video.qnaigc.com/user123/qvideo-user123-1766453713089395279/1.mp4?e=1767058636&token=IDB69r4gicDbMd9Fbmn9w2bWuEENg9i5_yasXqhp:4_dy0_qmZfuzBPO0JjTVZeTdkng=",
"duration": "4"
}
]
}
}
失败状态
{
"id": "qvideo-user123-1234567890123456789",
"object": "video",
"model": "sora-2",
"status": "failed",
"created_at": 1766453713,
"updated_at": 1766453836,
"completed_at": 1766453836,
"error": {
"code": "moderation_blocked",
"message": "Your request was blocked by our moderation system."
},
"seconds": "4",
"size": "1280x720"
}
视频 Remix 接口 (POST /videos/:id/remix)
接口说明: 基于已完成的视频任务,使用新的提示词重新生成视频,保持原视频的时长和分辨率。
Path 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 原视频任务 ID,必须是已完成(状态为 completed)的视频任务 |
Header 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| Authorization | string | 是 | API Key,格式:Bearer YOUR_API_KEY |
| Content-Type | string | 是 | 请求内容类型,固定值:application/json |
Body 参数 (JSON)
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| prompt | string | 是 | - | 新的视频生成提示词,最大 2500 字符 详细说明: • 新的视频生成提示词,用于重新生成视频 • 字符数限制:不超过 2500 个字符 • 建议:描述希望在新视频中呈现的变化、风格或效果 • 新视频将继承原视频的模型、时长和分辨率设置 |
响应体说明
Remix 接口返回格式与创建视频接口相同,会立即返回新视频任务的基本信息:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | string | 新视频任务唯一 ID,用于后续查询任务状态 |
| object | string | 对象类型,固定为 video |
| model | string | 使用的模型名称,继承自原视频 |
| status | string | 任务状态,通常为 queued(排队中) |
| created_at | integer | 创建时间(Unix 时间戳,秒) |
| updated_at | integer | 更新时间(Unix 时间戳,秒) |
| seconds | string | 视频时长(秒),继承自原视频 |
| size | string | 视频分辨率(宽x高),继承自原视频 |
| remixed_from_video_id | string | 原视频任务 ID,标识此视频是从哪个视频 Remix 而来 |
响应示例:
{
"id": "qvideo-user123-1766454050923137689",
"object": "video",
"model": "sora-2",
"status": "queued",
"created_at": 1766454050,
"updated_at": 1766454050,
"seconds": "4",
"size": "1280x720",
"remixed_from_video_id": "qvideo-user123-1766453713089395279"
}
HTTP 调用示例
基础文生视频
使用 sora-2 模型生成高分辨率 720P 视频:
# 调用 sora-2 文生视频 API
export OPENAI_BASE_URL="https://api.qnaigc.com/v1"
export OPENAI_API_KEY="<七牛云 AI API KEY>"
curl "$OPENAI_BASE_URL/videos" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "sora-2",
"prompt": "一只可爱的橘猫在阳光明媚的花园里追逐蝴蝶,照片风格,高清画质",
"seconds": "4",
"size": "1280x720"
}'
图生视频
使用 sora-2 模型基于参考图片生成视频:
# 基于参考图片生成视频
export OPENAI_BASE_URL="https://api.qnaigc.com/v1"
export OPENAI_API_KEY="<七牛云 AI API KEY>"
curl "$OPENAI_BASE_URL/videos" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "sora-2",
"prompt": "这个人在跑马拉松",
"input_reference": "https://aitoken-public.qnaigc.com/example/generate-video/running-man.jpg",
"seconds": "4",
"size": "1280x720"
}'
视频 Remix (sora-2)
使用 Remix 功能,可以基于已生成的视频使用新的提示词重新生成视频,保持原视频的时长和分辨率:
# 对已生成的视频进行 Remix
export OPENAI_BASE_URL="https://api.qnaigc.com/v1"
export OPENAI_API_KEY="<七牛云 AI API KEY>"
export VIDEO_ID="qvideo-user123-1234567890123456789"
curl "$OPENAI_BASE_URL/videos/$VIDEO_ID/remix" \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"prompt": "将场景改为夜晚,增加霓虹灯效果,赛博朋克风格"
}'
查询视频生成状态
# 查询视频任务状态
export OPENAI_BASE_URL="https://api.qnaigc.com/v1"
export OPENAI_API_KEY="<七牛云 AI API KEY>"
export VIDEO_ID="qvideo-user123-1234567890123456789"
curl "$OPENAI_BASE_URL/videos/$VIDEO_ID" \
-H "Authorization: Bearer $OPENAI_API_KEY"
响应示例 (处理中):
{
"id": "qvideo-user123-1234567890123456789",
"object": "video",
"model": "sora-2",
"status": "in_progress",
"created_at": 1234567890,
"updated_at": 1234567895
}
响应示例 (已完成):
{
"id": "qvideo-user123-1766453713089395279",
"object": "video",
"model": "sora-2",
"status": "completed",
"created_at": 1766453713,
"updated_at": 1766453836,
"completed_at": 1766453836,
"seconds": "4",
"size": "1280x720",
"task_result": {
"videos": [
{
"id": "qvideo-user123-1766453713089395279-1",
"url": "https://aitoken-video.qnaigc.com/user123/qvideo-user123-1766453713089395279/1.mp4?e=1767058636&token=IDB69r4gicDbMd9Fbmn9w2bWuEENg9i5_yasXqhp:4_dy0_qmZfuzBPO0JjTVZeTdkng=",
"duration": "4"
}
]
}
}
响应示例 (Remix 已完成):
{
"id": "qvideo-user123-1766454050923137689",
"object": "video",
"model": "sora-2",
"status": "completed",
"created_at": 1766454050,
"updated_at": 1766454320,
"completed_at": 1766454320,
"seconds": "4",
"size": "1280x720",
"remixed_from_video_id": "qvideo-user123-1766453713089395279",
"task_result": {
"videos": [
{
"id": "qvideo-user123-1766454050923137689-1",
"url": "https://aitoken-video.qnaigc.com/user123/qvideo-user123-1766454050923137689/1.mp4?e=1767059120&token=IDB69r4gicDbMd9Fbmn9w2bWuEENg9i5_yasXqhp:UEqrXzkWZ3AECDmSHie52HCLXgk=",
"duration": "4"
}
]
}
}
响应示例 (错误):
{
"id": "qvideo-user123-1234567890123456789",
"object": "video",
"model": "sora-2",
"status": "failed",
"created_at": 1766454050,
"updated_at": 1766454320,
"completed_at": 1766454320,
"error": {
"code": "moderation_blocked",
"message": "Your request was blocked by our moderation system."
},
"seconds": "4",
"size": "1280x720"
}
常见问题
Q: 如何将生成的视频保存到七牛云对象存储?
A: 生成的视频已经自动保存在七牛云对象存储 (Kodo) 中,返回的 URL 即为 Kodo 存储地址,但有效期仅有 7 天。如需转存到您自己的存储空间,推荐使用七牛对象存储的【SDK 中心】进行操作。更多对象存储信息欢迎参考对象存储的【产品使用文档】。
Q: 视频生成需要多长时间?
A: 视频生成时间取决于视频时长和当前队列情况。通常情况下:
- 4 秒视频:2-5 分钟
- 8 秒视频:5-10 分钟
- 12 秒视频:10-15 分钟
建议使用轮询方式查询任务状态。
Q: 生成的视频会保存多久?
A: 生成的视频会在 7 天后过期,建议在视频生成后及时下载或转存到您自己的存储空间。
Q: 如何提高视频生成质量?
A:
- 详细的提示词:描述越详细,生成效果越好
- 包含关键要素:场景、动作、风格、光线、氛围等
- 使用具体的风格描述:如"电影风格"、"高清画质"等
Q: 支持哪些视频格式和分辨率?
A:
- 输出格式:MP4
- 分辨率:可通过
size参数指定- 支持
1280x720(横屏)、720x1280(竖屏)
- 支持
- 视频时长:支持 4、8、12 秒
Q: 如何控制生成成本?
A:
- 选择合适的时长:视频时长直接影响成本
- 批量生成:提前规划好需求,避免重复生成
Q: Remix 功能的使用场景是什么?
A: Remix 功能适用于以下场景:
- 快速迭代:对已生成的视频进行风格调整或场景变化
- 内容变体:基于同一视频生成不同风格的版本(如将白天场景改为夜晚)
- 参数保持:当需要生成与原视频相同时长和分辨率的新内容时
Q: Remix 与直接创建新视频有什么区别?
A:
- Remix:基于原视频重新生成,自动继承原视频的模型、时长和分辨率,只需提供新的 prompt
- 创建新视频:完全独立的视频生成任务,需要提供所有参数(model、prompt、seconds、size 等)
- 建议:如果需要保持相同参数生成相似内容,使用 Remix 更方便;如果需要完全不同的视频,使用创建接口
Q: Remix 任务失败的常见原因?
A:
- 原视频未完成:原视频任务状态必须为
completed - 视频不存在或无权限:原视频 ID 不存在或不属于当前用户
- prompt 为空:Remix 请求必须提供 prompt 参数
Q: 为什么我的视频生成任务返回了 moderation_blocked 错误?
A: moderation_blocked 表示您的请求被内容审核系统拦截。这通常发生在以下情况:
- 提示词包含敏感内容:您的 prompt 可能包含暴力、色情、政治敏感、违法违规等不当内容
- 参考图片违规:使用图生视频功能时,提供的参考图片 (
input_reference) 可能包含违规内容 - 违反使用政策:请求内容违反了 AI 模型的使用政策和社区准则
解决方法:
- 检查并修改您的提示词,移除任何可能违规的内容描述
- 如使用图生视频功能,确保参考图片内容合规
- 使用更加中性、正面的描述方式
- 避免描述暴力、仇恨、成人内容等敏感主题