Dreamina Seedance 2.0 vs Veo 3.1
Lequel, quand — verdict de synthèse, pas un tableau de benchmarks
Tous deux acceptent du texte ou une image en entrée et retournent une vidéo .mp4 à 24 fps avec audio natif et guidage sur la première image ou la première/dernière image, la véritable différence réside donc dans l'étendue des options par rapport à la prévisibilité : dreamina-seedance-2-0-260128 (2026-01) couvre de 480p à 4K avec n'importe quelle durée de 4–15 s et 6 ratios d'aspect, tandis que veo-3.1-generate-001 (2025-10) est limité à 720p/1080p, 4/6/8 s et 16:9 ou 9:16, avec jusqu'à 2 images guides. Notez que les deux facturent dans des unités différentes — $7 par million de tokens en sortie contre $0.2 par seconde sans audio et $0.4 avec — aucune conversion simple n'est donc honnête ; le prix par clip doit être vérifié en fonction de la durée de vos propres plans.
Tarification
| Dreamina Seedance 2.0 | Veo 3.1 | Δ | |
|---|---|---|---|
| Par seconde de sortie (avec audio) | — | $0.4 | — |
| Par seconde de sortie (silencieux) | — | $0.2 | — |
| Par 1M tokens vidéo | $7 | — | — |
Ces deux modèles facturent dans des unités différentes, donc aucun Δ n'est affiché — leur conversion nécessiterait une hypothèse que nous n'avons pas mesurée. Chaque fiche est répertoriée dans sa propre unité ci-dessus.
Capacités
| Dreamina Seedance 2.0 | Veo 3.1 | |
|---|---|---|
| Audio natif | oui | oui |
Spécifications
| Dreamina Seedance 2.0 | Veo 3.1 | |
|---|---|---|
| Modalités d'entrée | texte image | texte image |
| Modalités de sortie | vidéo | vidéo |
| Sortie | 2026-01 | 2025-10 |
| Résolution | 480p – 4K (10-bit at 4K) (plage) | 720p / 1080p (ensemble fixe) |
| Durée du clip | 4–15 s (plage) | 4 / 6 / 8 s (ensemble fixe) |
| Fréquence d'images | 24 fps | 24 fps |
| Ratios d'aspect | 6 (incl. 16:9, 9:16, 1:1) |
|
| Modes d'entrée |
|
|
| Format | .mp4 | .mp4 |
Les spécifications sont transcrites à partir de la documentation de chaque fournisseur ; une ligne qu'un fournisseur ne publie pas est omise plutôt que déduite. Sources complètes : Dreamina Seedance 2.0 · Veo 3.1
Un prompt, deux modèles — mesurés via la passerelle
Renvoyé par le modèle 1280×720 Durée 5s latence 133 s
Renvoyé par le modèle 1280×720 Durée 8s latence 63 s
Un prompt, une requête par modèle, aucun nouvel essai et aucune sélection sur le volet — le premier résultat renvoyé par chaque modèle. Ni la taille ni la durée n'ont été fixées : chaque modèle a utilisé sa propre valeur par défaut, car une requête conçue pour s'adapter à tous n'en mettrait aucun en valeur. Les fichiers ici sont réencodés pour le web, jugez donc la composition et le respect du prompt, pas la compression.
Basculez de l'un à l'autre avec une seule ligne
Les deux ids sont dans chaque onglet ci-dessous — la paire de lignes en surbrillance est la seule modification. Même endpoint, même clé, même structure de requête.
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": "dreamina-seedance-2-0-260128",
# "model": "veo-3.1-generate-001", # décommentez cette ligne, commentez celle du dessus
"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: "dreamina-seedance-2-0-260128",
// model: "veo-3.1-generate-001", // décommentez cette ligne, commentez celle du dessus
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": "dreamina-seedance-2-0-260128",
# "model": "veo-3.1-generate-001", # décommentez cette ligne, commentez celle du dessus
"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": "dreamina-seedance-2-0-260128",
// "model": "veo-3.1-generate-001", // décommentez cette ligne, commentez celle du dessus
"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": "dreamina-seedance-2-0-260128",
// {"model": "veo-3.1-generate-001", // décommentez cette ligne, commentez celle du dessus
"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
Lequel est le moins cher, Dreamina Seedance 2.0 ou Veo 3.1 ?
Ils facturent dans des unités différentes, il n'y a donc pas de chiffre unique honnête : Dreamina Seedance 2.0 et Veo 3.1 apparaissent chacun dans leur propre unité dans le tableau ci-dessus. Comparez-les sur votre propre charge de travail — le compromis pratique est décrit dans le verdict en haut de cette page.
Puis-je faire un test A/B de Dreamina Seedance 2.0 par rapport à Veo 3.1 sans deux intégrations ?
Oui. Les deux sont servis via le même endpoint compatible OpenAI avec une seule clé API — le basculement est un changement de chaîne de modèle en une ligne, vous pouvez donc diriger une fraction du trafic vers chacun et comparer les factures directement.
Quelles durées de clip et résolutions prennent-ils en charge ?
Le tableau des spécifications ci-dessus dresse la liste des résolutions et des durées de clip publiées pour chaque modèle, et indique si une valeur est un ensemble fixe d'options ou une plage continue — les deux se ressemblent mais ont un prix différent, car la facturation à la seconde se multiplie par la durée.