Sora 2 vs Sora 2 Pro
Welches und wann — kuratiertes Fazit, keine Benchmark-Tabelle
sora-2-pro kostet 3x mehr pro Ausgabesekunde ($0.3 gegenüber $0.1), und was das kauft, ist eine Auflösungsstufe: 720p oder 1024p gegenüber nur 720p. Alles andere passt zusammen — 4–12 s bei 24 fps, 16:9 und 9:16, nativer Ton und Bild-zu-Video aus einem einzelnen Referenzbild. Nehmen Sie sora-2, sofern das Auslieferungsformat nicht das größere Bild verlangt.
Preise
| Sora 2 | Sora 2 Pro | Δ | |
|---|---|---|---|
| Pro Output-Sekunde (mit Audio) | $0.1 | $0.3 | 0.33× |
Preise aus dem Live-Katalog zum Zeitpunkt des Builds; jede Modellseite enthält die aktuelle Übersicht.
Wo sie stehen — Preis pro Ausgabesekunde über alle 7 Videogenerierung-Modelle mit dieser Abrechnungseinheit (logarithmische Skala)
Fähigkeiten
| Sora 2 | Sora 2 Pro | |
|---|---|---|
| Natives Audio | ja | ja |
Spezifikationen
| Sora 2 | Sora 2 Pro | |
|---|---|---|
| Input-Modalitäten | Text Bild | Text Bild |
| Ausgabemodalitäten | Video | Video |
| Veröffentlicht | 2025-09 | 2025-09 |
| Auflösung | 720p | 720p / 1024p (feste Auswahl) |
| Cliplänge | 4-12 s (Bereich) | 4-12 s (Bereich) |
| Bildrate | 24 fps | 24 fps |
| Seitenverhältnisse |
|
|
| Eingabemodi |
|
|
| Format | .mp4 | .mp4 |
Die Spezifikationen sind aus der Dokumentation der jeweiligen Anbieter übernommen; eine Zeile, die ein Anbieter nicht veröffentlicht, wird weggelassen und nicht abgeleitet. Vollständige Quellen: Sora 2 · Sora 2 Pro
Ein Prompt, beide Modelle — gemessen über das Gateway
Vom Modell zurückgegeben 720×1280 Dauer 4s Latenz 68 s
Vom Modell zurückgegeben 1280×720 Dauer 4s Latenz 130 s
Ein Prompt, ein Request pro Modell, keine Retries und kein Cherry-Picking — das erste Ergebnis, das jedes Modell zurückgegeben hat. Weder Größe noch Dauer wurden festgelegt: Jedes Modell verwendete seinen eigenen Standardwert, da ein auf alle zugeschnittener Request keinem gerecht werden würde. Die Dateien hier wurden für das Web neu kodiert, beurteilen Sie also Komposition und Prompt-Treue, nicht die Komprimierung.
Mit einer Zeile zwischen ihnen wechseln
Beide IDs befinden sich in jedem Tab unten — das hervorgehobene Zeilenpaar ist die einzige Änderung. Gleicher Endpunkt, gleicher Schlüssel, gleiche Request-Struktur.
import time
import requests
BASE = "https://synthorai.io/v1"
HEADERS = {"Authorization": "Bearer sk-syn-..."}
# 1) create the video generation job (POST /v1/videos)
task = requests.post(
f"{BASE}/videos",
headers=HEADERS,
json={
"model": "sora-2",
# "model": "sora-2-pro", # diese Zeile einkommentieren, die darüberliegende auskommentieren
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5,
},
).json()
# 2) poll the job until it reaches a terminal state
while task["status"] in ("queued", "in_progress"):
time.sleep(5)
task = requests.get(f"{BASE}/videos/{task['id']}", headers=HEADERS).json()
# 3) completed → signed video URL (valid ~24h — download and store it promptly)
if task["status"] == "completed":
print(task["data"][0]["url"])
else:
print(task["error"])const HEADERS = {
Authorization: "Bearer sk-syn-...",
"Content-Type": "application/json",
};
interface VideoTask {
id: string;
status: "queued" | "in_progress" | "completed" | "failed" | "cancelled";
data?: Array<{ url: string }>;
error?: { code: string; message: string };
}
// 1) create the video generation job (POST /v1/videos)
const created = await fetch("https://synthorai.io/v1/videos", {
method: "POST",
headers: HEADERS,
body: JSON.stringify({
model: "sora-2",
// model: "sora-2-pro", // diese Zeile einkommentieren, die darüberliegende auskommentieren
prompt: "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
resolution: "720p",
duration: 5,
}),
});
let task = (await created.json()) as VideoTask;
// 2) poll the job until it reaches a terminal state
while (task.status === "queued" || task.status === "in_progress") {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(`https://synthorai.io/v1/videos/${task.id}`, { headers: HEADERS });
task = (await res.json()) as VideoTask;
}
// 3) completed → signed video URL (valid ~24h — download and store it promptly)
if (task.status === "completed") console.log(task.data?.[0]?.url);
else console.error(task.error);# Create the job; "Prefer: wait" holds the request up to 60s and returns the
# completed task when generation finishes in time (else the queued task).
curl https://synthorai.io/v1/videos \
-H "Authorization: Bearer sk-syn-..." \
-H "Content-Type: application/json" \
-H "Prefer: wait=60" \
-d '{
"model": "sora-2",
# "model": "sora-2-pro", # diese Zeile einkommentieren, die darüberliegende auskommentieren
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5
}'
# Still queued / in_progress? Poll until completed → data[0].url (valid ~24h).
curl https://synthorai.io/v1/videos/vid_9f2e8c1a4b7d \
-H "Authorization: Bearer sk-syn-..."package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
const base = "https://synthorai.io/v1"
type videoTask struct {
ID string `json:"id"`
Status string `json:"status"`
Data []struct {
URL string `json:"url"`
} `json:"data"`
}
func call(method, url string, body []byte) (t videoTask) {
req, _ := http.NewRequest(method, url, bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer sk-syn-...")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
json.NewDecoder(resp.Body).Decode(&t)
return t
}
func main() {
// 1) create the video generation job (POST /v1/videos)
payload, _ := json.Marshal(map[string]any{
"model": "sora-2",
// "model": "sora-2-pro", // diese Zeile einkommentieren, die darüberliegende auskommentieren
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5,
})
task := call("POST", base+"/videos", payload)
// 2) poll the job until it reaches a terminal state
for task.Status == "queued" || task.Status == "in_progress" {
time.Sleep(5 * time.Second)
task = call("GET", base+"/videos/"+task.ID, nil)
}
// 3) completed → signed video URL (valid ~24h — download and store promptly)
if task.Status == "completed" {
fmt.Println(task.Data[0].URL)
}
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
// JDK built-in HttpClient — no extra dependency needed.
HttpClient http = HttpClient.newHttpClient();
// 1) create the job; "Prefer: wait=60" holds the request up to 60s and
// returns the completed task when generation finishes in time
HttpRequest create = HttpRequest.newBuilder(URI.create("https://synthorai.io/v1/videos"))
.header("Authorization", "Bearer sk-syn-...")
.header("Content-Type", "application/json")
.header("Prefer", "wait=60")
.POST(HttpRequest.BodyPublishers.ofString("""
{"model": "sora-2",
// {"model": "sora-2-pro", // diese Zeile einkommentieren, die darüberliegende auskommentieren
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p", "duration": 5}"""))
.build();
String task = http.send(create, HttpResponse.BodyHandlers.ofString()).body();
System.out.println(task); // {"id":"vid_…","status":…} — completed → data[0].url
// 2) still queued / in_progress? Poll GET https://synthorai.io/v1/videos/{id} until the
// status turns completed, then download data[0].url (valid ~24h).FAQ
Welches ist günstiger, Sora 2 oder Sora 2 Pro?
Sora 2 ist günstiger bei pro output-sekunde (mit audio) ($0.1 vs. $0.3, 3.0× Unterschied). Andere Zeilen können in die andere Richtung deuten — die obige Tabelle enthält alle Daten, und die tatsächlichen Kosten hängen von Ihrem Mix ab.
Kann ich Sora 2 gegen Sora 2 Pro ohne zwei Integrationen A/B-testen?
Ja. Beide werden über denselben OpenAI-kompatiblen Endpunkt mit einem API-Schlüssel bereitgestellt — der Wechsel ist eine einzeilige Änderung des Modell-Strings, sodass Sie einen Bruchteil des Traffics an jedes Modell leiten und die Rechnungen direkt vergleichen können.
Welche Cliplängen und Auflösungen unterstützen sie?
Die obige Spezifikationstabelle listet die von jedem Modell veröffentlichten Auflösungen und Cliplängen auf und markiert, ob es sich bei einem Wert um eine feste Auswahl an Optionen oder einen kontinuierlichen Bereich handelt — beide sehen ähnlich aus und sind unterschiedlich bepreist, da sich die sekundenbasierte Abrechnung mit der Länge multipliziert.