Sora-2 视频生成示例
以下示例展示如何使用OpenAI Sora-2模型生成高质量的视频内容。
快速开始(不带参考帧)
curl -X POST "https://model-api.skyengine.com.cn/v1/videos" \
-H "Authorization: Bearer <API-KEY>" \
-H "Content-Type: multipart/form-data" \
-F "prompt=有一个飞机在缓缓飞过" \
-F "model=sora-2-2025-10-06" \
-F "size=1280x720" \
-F "seconds=8"
带参考帧生成
curl --request POST \
--url https://model-api.skyengine.com.cn/v1/videos \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Content-Type: multipart/form-data' \
--form model=sora-2-2025-10-06 \
--form 'prompt=一只可爱的小猫在花园里玩耍' \
--form input_reference=@example-file
支持的参数
| 参数 | 类型 | 说明 |
|---|
| prompt | String (必需) | 视频的自然语言描述。建议包含镜头类型、主体、动作、场景、光线以及期望的摄像机运动,以减少歧义。保持单一目的以获得最佳效果。 |
| model | String (可选) | 模型名称,默认 sora-2-2025-10-06 |
| size | String (可选) | 输出分辨率(宽×高)。竖屏: 720x1280,横屏: 1280x720。默认: 720x1280 |
| seconds | String (可选) | 视频时长,可选值: 4 / 8 / 12。默认: 4 |
| input_reference | File (可选) | 单张参考图片,用作第一帧的视觉锚点。支持的 MIME 类型: image/jpeg, image/png, image/webp。图片尺寸必须与 size 参数完全匹配。 |
视频生成流程
- 提交任务: 发送生成请求,获得任务ID
- 等待处理: 定期检查任务状态(processing -> completed)
- 下载视频: 任务完成后下载生成的视频文件
响应示例
任务提交响应
{
"id": "video_68fe5e3df4508190899b2b7999569a71",
"object": "video",
"created_at": 1761500734,
"model": "sora-2-2025-10-06",
"status": "queued",
"progress": 0,
"seconds": "4",
"size": "1280x720"
}
查询视频生成状态
视频生成是异步任务,提交请求后需要轮询查询状态直到完成。
curl -X GET "https://model-api.skyengine.com.cn/v1/videos/{video_id}" \
-H "Authorization: Bearer <API-KEY>"
状态查询响应
{
"id": "video_68fe5e3df4508190899b2b7999569a71",
"object": "video",
"created_at": 1761500734,
"completed_at": 1761500854,
"model": "sora-2-2025-10-06",
"status": "completed",
"progress": 100,
"seconds": "4",
"size": "1280x720"
}
状态说明
| 状态 | 说明 |
|---|
| queued | 任务已提交,等待处理 |
| processing | 视频正在生成中 |
| completed | 视频生成完成,可以下载 |
| failed | 视频生成失败,查看 error 字段获取详情 |
下载生成的视频
视频生成完成后,可以通过 /videos/{video_id}/content 接口下载视频文件。
curl -X GET "https://model-api.skyengine.com.cn/v1/videos/{video_id}/content" \
-H "Authorization: Bearer <API-KEY>" \
-o "generated_video.mp4"
完整示例:生成并下载视频
以下是一个完整的示例,展示从提交生成请求到下载视频的完整流程。
import requests
import base64
import time
API_KEY = "<API-KEY>"
BASE_URL = "https://model-api.skyengine.com.cn/v1"
def generate_video(prompt, model="sora-2-2025-10-06", size="1280x720", seconds="8"):
"""提交视频生成请求"""
url = f"{BASE_URL}/videos"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": model,
"size": size,
"seconds": seconds,
"content": [{"type": "text", "text": prompt}]
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
return response.json()
else:
print(f"生成请求失败: {response.status_code} - {response.text}")
return None
def check_status(video_id):
"""查询视频状态"""
url = f"{BASE_URL}/videos/{video_id}"
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get(url, headers=headers)
return response.json() if response.status_code == 200 else None
def download_video(video_id, output_path):
"""下载视频"""
url = f"{BASE_URL}/videos/{video_id}/content"
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get(url, headers=headers, stream=True)
if response.status_code == 200:
with open(output_path, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
return True
return False
def generate_video_complete(prompt, max_wait_time=300):
"""完整流程:生成 -> 等待 -> 下载"""
print("1. 提交视频生成请求...")
result = generate_video(prompt)
if not result:
return None
video_id = result.get('id')
print(f" 任务ID: {video_id}")
print("2. 等待视频生成完成...")
start_time = time.time()
while time.time() - start_time < max_wait_time:
status_info = check_status(video_id)
if not status_info:
break
status = status_info.get('status')
progress = status_info.get('progress', 0)
print(f" 状态: {status}, 进度: {progress}%")
if status == 'completed':
break
elif status == 'failed':
print(f" 失败: {status_info.get('error', {}).get('message')}")
return None
time.sleep(10)
else:
print(" 超时")
return None
print("3. 下载视频...")
output_path = f"sora2_video_{video_id}.mp4"
if download_video(video_id, output_path):
print(f" 完成!视频已保存: {output_path}")
return output_path
return None
# 使用示例
if __name__ == "__main__":
video_path = generate_video_complete("一只可爱的小猫在花园里玩耍,阳光明媚")
if video_path:
print(f"\n视频生成成功: {video_path}")
else:
print("\n视频生成失败")
平台兼容视频接口
除了使用 multipart/form-data 格式,我们的平台还支持使用 JSON 格式的 content 字段来传递 prompt 和参考图片,这种方式更加灵活,适合程序化调用。
Content 字段结构
content 是一个数组,每个元素包含以下字段:
| 字段 | 类型 | 说明 |
|---|
| type | String | 内容类型:text(文本)、image_url(图片URL)、image_base64(Base64图片) |
| text | String | 文本内容(当 type=text 时) |
| image_url | Object | 图片信息(当 type=image_url 或 image_base64 时),包含 url 字段 |
纯文本生成视频
curl -X POST "https://model-api.skyengine.com.cn/v1/videos" \
-H "Authorization: Bearer <API-KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-2-2025-10-06",
"size": "1280x720",
"seconds": "8",
"content": [
{
"type": "text",
"text": "有一个飞机在缓缓飞过蓝天白云"
}
]
}'
使用图片 URL 作为参考帧
curl -X POST "https://model-api.skyengine.com.cn/v1/videos" \
-H "Authorization: Bearer <API-KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-2-2025-10-06",
"size": "1280x720",
"seconds": "8",
"content": [
{
"type": "text",
"text": "让画面中的飞机缓缓起飞,穿越云层"
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/airplane.jpg"
}
}
]
}'
使用 Base64 编码的图片
curl -X POST "https://model-api.skyengine.com.cn/v1/videos" \
-H "Authorization: Bearer <API-KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-2-2025-10-06",
"size": "1280x720",
"seconds": "8",
"content": [
{
"type": "text",
"text": "让画面中的小猫跳跃玩耍"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
}
]
}'
Content 字段请求示例
{
"model": "sora-2-2025-10-06",
"size": "1280x720",
"seconds": "8",
"content": [
{
"type": "text",
"text": "让画面中的飞机缓缓起飞"
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/airplane.jpg"
}
}
]
}
提示:使用 content 字段时,系统会自动从中提取文本作为 prompt,提取图片作为参考帧。如果同时提供了 prompt 字段和 content 中的文本,prompt 字段会优先使用。