Skip to main content

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

支持的参数

参数类型说明
promptString (必需)视频的自然语言描述。建议包含镜头类型、主体、动作、场景、光线以及期望的摄像机运动,以减少歧义。保持单一目的以获得最佳效果。
modelString (可选)模型名称,默认 sora-2-2025-10-06
sizeString (可选)输出分辨率(宽×高)。竖屏: 720x1280,横屏: 1280x720。默认: 720x1280
secondsString (可选)视频时长,可选值: 4 / 8 / 12。默认: 4
input_referenceFile (可选)单张参考图片,用作第一帧的视觉锚点。支持的 MIME 类型: image/jpeg, image/png, image/webp。图片尺寸必须与 size 参数完全匹配。

视频生成流程

  1. 提交任务: 发送生成请求,获得任务ID
  2. 等待处理: 定期检查任务状态(processing -> completed)
  3. 下载视频: 任务完成后下载生成的视频文件

响应示例

任务提交响应

{
  "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 是一个数组,每个元素包含以下字段:
字段类型说明
typeString内容类型:text(文本)、image_url(图片URL)、image_base64(Base64图片)
textString文本内容(当 type=text 时)
image_urlObject图片信息(当 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 字段会优先使用。