Dreamina Seedance 2.0 Mini vs Veo 3.1
언제 어떤 모델을 쓸까
이 둘은 모두 텍스트와 이미지 입력을 받아 24 fps로 네이티브 오디오가 포함된 .mp4 출력을 생성하지만, 과금 단위가 다릅니다 - dreamina-seedance-2-0-mini-260615 모델은 100만 출력 토큰당 $3.5를 청구하는 반면, veo-3.1-generate-001 모델은 오디오 미포함 시 1초당 $0.2, 오디오 포함 시 1초당 $0.4를 청구합니다 - 따라서 이 둘 사이의 단일 변환은 정확하지 않습니다. 자유로운 형식의 4-15 s 지속 시간, 480p 또는 720p, 그리고 1:1을 포함한 6개의 화면 비율 선택지가 필요하다면 ByteDance 모델을 선택하십시오. 1080p 출력, 16:9 또는 9:16 비율의 고정된 4/6/8 s 클립, 최대 2개의 가이드 이미지가 필요하다면 2025-10에 출시된 veo-3.1-generate-001 모델을 선택하십시오.
벤치마크
Dreamina Seedance 2.0 Mini: 공급자가 벤치마크 점수를 공개하지 않았습니다.
Veo 3.1: 12개가 공개됐지만, 비교할 수 있을 만큼 여러 모델이 함께 측정한 벤치마크가 없습니다.
공급자 공개 자료: ByteDance
가격
| Dreamina Seedance 2.0 Mini | Veo 3.1 | Δ | |
|---|---|---|---|
| 출력 초당(오디오 포함) | - | $0.4 | - |
| 출력 초당(무음) | - | $0.2 | - |
| 1M 동영상 토큰당 | $3.5 | - | - |
두 모델은 과금 단위가 달라 Δ를 표시하지 않습니다. 단위를 환산하려면 저희가 측정하지 않은 가정이 필요하기 때문입니다. 위 요금표는 모델마다 자체 단위로 표시했습니다.
기능
| Dreamina Seedance 2.0 Mini | Veo 3.1 | |
|---|---|---|
| 네이티브 오디오 | 지원 | 지원 |
사양
| Dreamina Seedance 2.0 Mini | Veo 3.1 | |
|---|---|---|
| 입력 모달리티 | 텍스트 이미지 | 텍스트 이미지 |
| 출력 모달리티 | 동영상 | 동영상 |
| 출시일 | 2026-06 | 2025-10 |
| 해상도 | 480p / 720p (고정 선택지) | 720p / 1080p (고정 선택지) |
| 클립 길이 | 4-15 s (범위) | 4 / 6 / 8 s (고정 선택지) |
| 프레임 레이트 | 24 fps | 24 fps |
| 화면 비율 | 6 (incl. 16:9, 9:16, 1:1) |
|
| 입력 방식 |
|
|
| 포맷 | .mp4 | .mp4 |
사양은 각 공급자의 문서에서 그대로 옮겨 적었습니다. 공급자가 공개하지 않은 항목은 추정해 채우지 않고 뺐습니다. 전체 출처: Dreamina Seedance 2.0 Mini · Veo 3.1
같은 프롬프트, 두 모델: 게이트웨이를 거쳐 측정
모델이 반환한 크기 1280×720 길이 5s
모델이 반환한 크기 1280×720 길이 8s 지연 시간 63 s
프롬프트 하나에 모델당 요청 한 번, 재시도도 골라내기도 없이 각 모델이 처음 반환한 결과입니다. 크기와 길이는 고정하지 않고 모델마다 기본값을 그대로 썼습니다. 모든 모델에 맞춘 요청은 어느 모델의 장점도 살리지 못하기 때문입니다. 여기 있는 파일은 웹용으로 다시 인코딩한 것이므로, 압축 품질이 아니라 구도와 프롬프트 반영 정도를 보고 판단하세요.
코드 한 줄로 모델 전환
아래 탭마다 두 모델 id가 모두 들어 있습니다. 바꿀 곳은 강조된 두 줄뿐이고, 엔드포인트, 키, 요청 형식은 그대로입니다.
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-mini-260615",
# "model": "veo-3.1-generate-001", # 이 줄의 주석을 해제하고, 윗줄을 주석 처리하세요
"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-mini-260615",
// model: "veo-3.1-generate-001", // 이 줄의 주석을 해제하고, 윗줄을 주석 처리하세요
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-mini-260615",
# "model": "veo-3.1-generate-001", # 이 줄의 주석을 해제하고, 윗줄을 주석 처리하세요
"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-mini-260615",
// "model": "veo-3.1-generate-001", // 이 줄의 주석을 해제하고, 윗줄을 주석 처리하세요
"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-mini-260615",
// {"model": "veo-3.1-generate-001", // 이 줄의 주석을 해제하고, 윗줄을 주석 처리하세요
"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).자주 묻는 질문
Dreamina Seedance 2.0 Mini vs Veo 3.1, 어느 쪽이 더 저렴한가요?
과금 단위가 서로 달라 하나의 수치로 답하기 어렵습니다. 위 표에서 Dreamina Seedance 2.0 Mini, Veo 3.1 모두 각자의 단위로 표시됩니다. 실제 워크로드로 직접 비교해 보세요. 실무에서 따져 볼 장단점은 이 페이지 맨 위 결론에 정리했습니다.
연동을 두 번 하지 않고도 Dreamina Seedance 2.0 Mini vs Veo 3.1 A/B 테스트를 할 수 있나요?
네. 두 모델 모두 API 키 하나로 같은 OpenAI 호환 엔드포인트에서 호출합니다. 모델 문자열 한 줄만 바꾸면 전환되므로, 트래픽 일부를 각 모델로 보내 청구 금액을 직접 비교할 수 있습니다.
어떤 클립 길이와 해상도를 지원하나요?
위 사양 표에 각 모델이 공개한 해상도와 클립 길이가 있고, 값이 정해진 선택지인지 연속 범위인지도 표시했습니다. 둘은 비슷해 보여도 요금이 다르게 나옵니다. 초당 과금에서는 길이만큼 요금이 곱해지기 때문입니다.