sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08,且 sora-2-pro-2025-10-06。请参阅 废弃说明页 for details.概览
Sora 是 OpenAI 在生成式媒体领域的最新突破——这是一款最先进的视频模型,能够根据自然语言或图像创建带有音频、细节丰富且动态的视频片段。基于多年对多模态扩散的研究并在多样化的视觉数据上训练而成,Sora 为文本到视频生成带来了对 3D 空间、运动和场景连续性的深刻理解。
The Videos API 首次向开发者开放了这些功能,支持以编程方式创建、延伸、编辑和管理视频。
你可以使用它来:
- 从提示词创建新视频。
- 使用图像参考指导生成过程。
- 在多次生成中重复使用角色资产,以获得更强的视觉一致性。
- 通过视频扩展延续已完成的片段。
- 通过针对性修改编辑现有视频。
- 下载完成的视频和辅助资产。
- 通过以下方式提交大型离线渲染队列 Batch API.
模型
第二代的 Sora 模型提供两种变体,每种均针对不同的用例量身定制。
Sora 2
sora-2 专为 速度和灵活性而设计。它非常适合探索阶段,当你尝试不同的基调、结构或视觉风格,需要快速反馈而非完美保真度时。
它能快速生成高质量的结果,非常适合快速迭代、概念探索和粗剪。 sora-2 通常已能满足社交媒体内容、原型设计,以及交付速度比超高保真度更重要的场景。
Sora 2 专业版
sora-2-pro 能生成更高质量的结果。当您需要 制作级输出时,它是更好的选择.
sora-2-pro 渲染时间更长,运行成本更高,但能生成更精致、更稳定的结果。它最适合高分辨率的电影级镜头、营销素材,以及对视觉精度要求极高的任何场景。
使用 sora-2-pro 如果您需要在 1920x1080 or 1080x1920.
- 和 sora-2 and sora-2-pro 支持 16- 秒生成时导出 1080p,请使用 20秒生成。
生成视频
生成视频是一个 异步 process:
-
当您调用
POST /videosendpoint,API 将返回一个包含 jobidand an initialstatus. -
你可以轮询
GET /videos/{video_id}endpoint 直到状态变为 completed,或者 – 为了更高效 – 使用 webhooks(参见下文的 webhooks 部分)以便在任务完成时自动收到通知。 -
一旦任务达到
completed状态,你就可以使用以下方式获取最终的 MP4 文件GET /videos/{video_id}/content.
启动渲染任务
首先调用 POST /videos 并传入文本提示词和必需的参数。提示词定义了创意的外观与风格(包括主体、镜头、光照和运动),而像 size and seconds 等参数则控制视频的分辨率和长度。
1
2
3
4
5
6
7
8
9
10
import OpenAI from 'openai';
const openai = new OpenAI();
let video = await openai.videos.create({
model: 'sora-2',
prompt: "A video of the words 'Thank you' in sparkling letters",
});
console.log('Video generation started: ', video);响应是一个 JSON 对象,包含唯一的 id 和初始状态,例如 queued or in_progress。这意味着渲染任务已启动。
1
2
3
4
5
6
7
8
9
10
{
"id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
"object": "video",
"created_at": 1758941485,
"status": "queued",
"model": "sora-2-pro",
"progress": 0,
"seconds": "8",
"size": "1280x720"
}选择尺寸和时长
选择满足你制作需求的最小格式:
- 在迭代提示词、运动或构图时,请使用较短的片段。
- 当你需要更长的节拍、更完整的场景或片段时,可以生成最长为
20秒的视频。 - 使用
sora-2-profor higher-resolution exports in1920x1080or1080x1920.
较长时长和 1080p 的任务完成时间可能会比短的 720p 或 480p 渲染耗时显著更长,因此请在面向用户的流程中规划更高的延迟。
防护栏与限制
API 强制执行多项内容限制:
- 仅限适合 18 岁以下受众的内容(未来将提供绕过此限制的设置)。
- 受版权保护的角色和受版权保护的音乐将被拒绝。
- 无法生成真实人物(包括公众人物)。
- 默认情况下,系统会阻止描绘人类肖像的角色上传。
- 目前会拒绝包含人类面部特征的输入图像。
请确保提示词、参考图像和文字稿遵守这些规则,以避免生成失败。
撰写有效提示词
For best results, describe 镜头类型、主体、动作、背景和光照。例如:
- “全景镜头,一个孩子在长满草的公园里放飞红色的风筝,黄金时刻的阳光,镜头缓缓向上摇。”
- “特写镜头,木桌上冒着热气的咖啡杯,百叶窗透入的晨光,柔和的景深。”
这种程度的细节描述有助于模型生成一致的结果,避免凭空捏造多余的细节。有关更高级的提示词技巧,请参阅我们专门的 Sora 2 提示词指南.
监控进度
视频生成需要一定时间。具体耗时取决于所使用的模型、API 负载和分辨率, 单次渲染可能需要几分钟时间.
为了高效管理,您可以通过轮询 API 来请求状态更新,也可以通过 webhook 获取通知。
轮询状态端点
像往常一样调用 GET /videos/{video_id} 使用创建调用返回的 id。响应会显示作业的当前状态、进度百分比(如可用)以及任何错误信息。
常见状态包括 queued, in_progress, completed,且 failed。请以合理的间隔进行轮询(例如每 10–20 秒一次),必要时使用指数退避策略,并向用户反馈任务仍在进行中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import OpenAI from 'openai';
const openai = new OpenAI();
async function main() {
const video = await openai.videos.createAndPoll({
model: 'sora-2',
prompt: "A video of the words 'Thank you' in sparkling letters",
});
if (video.status === 'completed') {
console.log('Video successfully completed: ', video);
} else {
console.log('Video creation failed. Status: ', video.status);
}
}
main();响应示例:
1
2
3
4
5
6
7
8
9
10
{
"id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
"object": "video",
"created_at": 1758941485,
"status": "in_progress",
"model": "sora-2-pro",
"progress": 33,
"seconds": "8",
"size": "1280x720"
}使用 webhook 获取通知
无需反复轮询作业状态,使用 GET,注册一个 网络钩子 (webhook) 即可在视频生成完成或失败时自动收到通知。
您可以在您的 webhook 设置页面。任务完成时,API 会触发以下两种事件类型之一: video.completed and video.failed。每个事件都包含触发该事件的 ID。
配置 webhook。Webhook 载荷示例:
{
"id": "evt_abc123",
"object": "event",
"created_at": 1758941485,
"type": "video.completed", // or "video.failed"
"data": {
"id": "video_abc123"
}
}获取结果
下载 MP4
一旦作业达到状态 completed,使用以下命令获取 MP4: GET /videos/{video_id}/content。该端点会流式传输二进制视频数据并返回标准的内容标头,因此你可以将文件直接保存到磁盘,或将其传输到云存储中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import OpenAI from 'openai';
const openai = new OpenAI();
let video = await openai.videos.create({
model: 'sora-2',
prompt: "A video of the words 'Thank you' in sparkling letters",
});
console.log('Video generation started: ', video);
let progress = video.progress ?? 0;
while (video.status === 'in_progress' || video.status === 'queued') {
video = await openai.videos.retrieve(video.id);
progress = video.progress ?? 0;
// Display progress bar
const barLength = 30;
const filledLength = Math.floor((progress / 100) * barLength);
// Simple ASCII progress visualization for terminal output
const bar = '='.repeat(filledLength) + '-'.repeat(barLength - filledLength);
const statusText = video.status === 'queued' ? 'Queued' : 'Processing';
process.stdout.write(`${statusText}: [${bar}] ${progress.toFixed(1)}%`);
await new Promise((resolve) => setTimeout(resolve, 2000));
}
// Clear the progress line and show completion
process.stdout.write('\n');
if (video.status === 'failed') {
console.error('Video generation failed');
return;
}
console.log('Video generation completed: ', video);
console.log('Downloading video content...');
const content = await openai.videos.downloadContent(video.id);
const body = content.arrayBuffer();
const buffer = Buffer.from(await body);
require('fs').writeFileSync('video.mp4', buffer);
console.log('Wrote video.mp4');您现在就获得了可用于播放、编辑或分发的最终视频文件。下载链接在生成后的最长有效期为 1 小时。如需长期存储,请及时将文件复制到您自己的存储系统中。
下载辅助素材
对于每个已完成的视频,您还可以下载 缩略图 and a 雪碧图。这些是轻量级资产,可用于预览、滑动条或目录展示。使用 variant 查询参数来指定您要下载的内容。默认为 variant=video for the MP4.
1
2
3
4
5
6
7
8
9
# Download a thumbnail
curl -L "https://api.openai.com/v1/videos/video_abc123/content?variant=thumbnail" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
--output thumbnail.webp
# Download a spritesheet
curl -L "https://api.openai.com/v1/videos/video_abc123/content?variant=spritesheet" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
--output spritesheet.jpg使用图像参考
您可以使用输入图像来指导生成过程,该图像将作为 视频的首帧。如果你需要输出视频保留品牌资产、角色或特定环境的外观,此功能会非常有用。
根据请求类型选择 input_reference 格式:
- 使用
input_reference其中包含已上传图像的multipart/form-datarequests. - 使用
input_reference包含一个 JSON 对象,用于application/json请求,包括 Batch。JSON 格式接受file_idorimage_url.
图像必须与目标视频的分辨率相匹配(size).
支持的文件格式为 image/jpeg, image/png,且 image/webp.
1
2
3
4
5
6
7
8
curl -X POST "https://api.openai.com/v1/videos" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F prompt="She turns around and smiles, then slowly walks out of the frame." \
-F model="sora-2-pro" \
-F size="1280x720" \
-F seconds="8" \
-F input_reference="@sample_720p.jpeg;type=image/jpeg"| 使用以下方式生成的输入图像 OpenAI GPT 图像 | 使用 Sora 2 生成的视频(已转换为 GIF) |
|---|---|
下载此图像 | Prompt: “她转过身微笑,然后慢慢走出画面。” |
下载此图像 | Prompt: “冰箱门打开了。一只可爱、胖乎乎的紫色小怪兽从里面钻了出来。” |
使用角色保持一致性
角色功能允许您上传一个可重复使用的非人类主体,并在多次生成中对其进行引用。当您希望某个动物、吉祥物或物体在多个镜头中保持相同的核心外观、风格和屏幕呈现时,此功能非常有用。
角色上传目前最适合 2- to 4秒的短视频片段,适用于
16:9 or 9:16, at 720p to 1080p。当角色源视频的宽高比与所请求输出的宽高比一致时,效果最佳。如果宽高比不一致,角色可能会出现拉伸或变形。单个视频最多可包含两个角色。
角色与 input_reference。图像参考用于调节单次生成的起始帧,而角色资产则可以在未来的视频请求中重复使用。
通过将短视频 MP4 片段上传至 POST /v1/videos/characters,然后在 characters 数组来创建视频,以此创建角色。
描绘人类形象的角色上传默认会被拦截。请联系您的客户经理或 联系我们的销售团队 以了解获取人类形象访问权限的更多资格信息。
1
2
3
4
5
curl -X POST "https://api.openai.com/v1/videos/characters" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "video=@character.mp4;type=video/mp4" \
-F "name=Mossy"在提示词中原样提及角色名称。仅传递角色 ID 不足以在镜头中可靠地保留该角色。
角色可以与 input_reference。扩展不支持这些字符。
1
2
3
4
5
6
7
8
9
10
11
12
curl -X POST "https://api.openai.com/v1/videos" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-2",
"prompt": "A cinematic tracking shot of Mossy, a moss-covered teapot mascot, weaving through a lantern-lit market at dusk.",
"size": "1280x720",
"seconds": "8",
"characters": [
{ "id": "char_123" }
]
}'延长已完成的视频
视频延长功能允许您基于现有的已完成视频继续生成,并创建一个新的拼接结果。在 video 字段中提供源视频,以便 POST /v1/videos/extensions,添加一个描述场景应如何继续的提示,API 会以完整的源片段作为上下文生成下一段。
当您希望保持动作、镜头方向和场景连贯性时,请使用延长功能。如果您只需要控制新生成视频的起始帧,请使用 input_reference instead.
每次延长最多可增加 20 秒。单个视频最多可延长六次,最大总时长为 120 秒。延长功能目前仅接受源视频和提示词,不支持角色或图像参考。
1
2
3
4
5
6
7
8
9
10
curl -X POST "https://api.openai.com/v1/videos/extensions" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video": {
"id": "video_abc123"
},
"prompt": "Continue the scene as the camera rises over the rooftops and reveals the sunrise.",
"seconds": "8"
}'编辑现有视频
编辑功能允许你基于已有视频进行针对性调整,而无需从头开始重新生成。请发送 POST /v1/videos/edits 以及提示词和 video 引用,系统将保留原始结构、连续性和构图,同时应用修改。当进行单一、明确的更改时,效果最佳,因为更小、更具针对性的编辑能更多地保留原始视频的保真度,并降低引入瑕疵的风险。
此前,视频生成结果可以通过即将被弃用的 remix 端点进行编辑。请在新集成中使用 edits 端点。
The video 字段接受视频 ID 或上传的视频。如果你传入视频 ID,API 将从源视频推断所用的模型。
编辑上传视频的功能仅面向符合资格的客户开放。如果你需要使用此工作流,请联系你的客户经理或 联系我们的销售团队 如果您需要此工作流。
1
2
3
4
5
6
7
8
9
curl -X POST "https://api.openai.com/v1/videos/edits" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video": {
"id": "video_abc123"
},
"prompt": "Shift the color palette to teal, sand, and rust, with a warm backlight."
}'如果你上传的是新视频而非编辑已有生成结果,请在请求中显式设置
model 在请求中明确指定。
1
2
3
4
5
6
curl -X POST "https://api.openai.com/v1/videos/edits" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "video=@source.mp4;type=video/mp4" \
-F "model=sora-2-pro" \
-F "prompt=Shift the color palette to teal, sand, and rust, with a warm backlight."编辑功能对于迭代工作尤为实用,因为它让你在不舍弃已有满意内容的情况下进行精修。通过将每次编辑限制为单一、清晰的调整,你可以在保持视觉风格、主体一致性和镜头取景稳定的同时,探索情绪、色彩或布局的变化。这让你能够通过微小且可靠的步骤,轻松构建出精致的序列。
| 原始视频 | 编辑生成的视频 |
|---|---|
![]() | Prompt: “将怪物的颜色改为橙色。” |
![]() | Prompt: “紧接着出现第二只怪物。” |
通过 Batch API 运行视频任务
使用 Batch API 当你需要将大量视频渲染加入队列以进行离线处理、审查流程或工作室工作流时。批量输入文件中的每一行都使用与你发送给 POST /v1/videos,这使其非常适合用于镜头列表和计划渲染队列。
对于 Batch 中的视频生成:
- Batch 目前支持
POST /v1/videosonly. - 批量请求必须使用 JSON,而不是 multipart 格式。
- 提前上传素材,并在 JSON 请求体中引用它们。
- 使用
input_reference用于 Batch 中的图像引导生成。在 JSON 请求中,将input_reference作为包含file_idorimage_url. - Multipart
input_reference上传(包括视频参考输入)在 Batch 中不受支持。 - Batch 生成的视频在批次完成后最多可下载
24小时。
{"custom_id":"shot-001","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Slow dolly shot through a miniature paper city at blue hour, soft fog, practical window lights flickering on.","size":"1920x1080","seconds":"20"}}
{"custom_id":"shot-002","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Portrait close-up of a red panda chef plating noodles in a stainless-steel kitchen, shallow depth of field.","size":"1080x1920","seconds":"16"}}当批量任务达到 completed,其输出中的视频任务已经达到某种终止状态,例如 completed, failed, or expired。使用 stable custom_id 值,以便你能将批量结果映射回内部的镜头 ID、剪辑队列或素材流程,然后使用返回的视频 ID 下载最终素材。
维护你的视频库
使用 GET /videos 以枚举你的视频。该端点支持用于分页和排序的可选查询参数。
curl "https://api.openai.com/v1/videos?limit=20&after=video_123&order=asc" \
-H "Authorization: Bearer $OPENAI_API_KEY" | jq .使用 DELETE /videos/{video_id} 以从 OpenAI 存储中删除不再需要的视频。
curl -X DELETE "https://api.openai.com/v1/videos/REPLACE_WITH_YOUR_VIDEO_ID" \
-H "Authorization: Bearer $OPENAI_API_KEY" | jq .












Prompt: “她转过身微笑,然后慢慢走出画面。”
Prompt: “冰箱门打开了。一只可爱、胖乎乎的紫色小怪兽从里面钻了出来。”
Prompt: “将怪物的颜色改为橙色。”
Prompt: “紧接着出现第二只怪物。”