Reference-to-Video API

reference-to-video는 Seedance 2.0의 가장 강력한 모드입니다. 단일 요청에 참조 이미지 최대 9개 + 참조 비디오 3개 + 참조 오디오 클립 3개를 포함할 수 있으며, 모델은 이 모든 자료에서 신호를 받아 새로운 영상을 합성합니다.

대표적인 활용 사례:

  • 스타일 참조 — 특정 아트 스타일을 정의하는 이미지 몇 장; 새 영상이 그 스타일을 그대로 반영
  • 캐릭터 / 제품 참조 — 동일한 가상 캐릭터나 제품이 새로운 장면과 동작에서 일관되게 등장하도록 유지
  • 카메라 워크 참조 — 원하는 카메라 페이싱과 움직임을 보여주는 데모 영상
  • 음악 기반 페이싱 — 시각적 리듬과 분위기를 이끄는 참조 오디오 클립
  • 영상 편집 / 확장 — 기존 푸티지를 이어 붙이거나 확장 또는 리라이트

엔드포인트

POST https://api.evolink.ai/v1/videos/generations

모델 ID: seedance-2.0-reference-to-video

Fast 변형은 seedance-2.0-fast-reference-to-video이며 매개변수 구조는 동일합니다.

요청 매개변수

매개변수유형필수기본값설명
modelstringseedance-2.0-reference-to-video로 지정해야 합니다
promptstring영상 설명. 각 참조 자료의 역할을 자연어로 명시합니다(예: "video 1의 1인칭 시점을 사용하고, audio 1을 전체 배경 음악으로 사용"). 한국어/중국어 500자 이하 또는 영어 1000단어 이하
image_urlsarray<string>아니요참조 이미지 URL 0~9개
video_urlsarray<string>아니요참조 비디오 URL 0~3개
audio_urlsarray<string>아니요참조 오디오 URL 0~3개
durationinteger아니요5영상 길이(초). 4~15
qualitystring아니요720p480p 또는 720p
aspect_ratiostring아니요16:916:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive
generate_audioboolean아니요true동기화된 오디오 생성 여부
callback_urlstring아니요작업 완료 콜백을 받을 HTTPS URL

중요한 제약: image_urls, video_urls, audio_urls는 모두 비울 수 있습니다(이 경우 순수 text-to-video와 동일). 그러나 audio_urls만 단독으로 제공하는 것은 허용되지 않습니다. 오디오를 제공할 때는 시각적 앵커로서 이미지 또는 비디오 중 적어도 하나를 함께 제공해야 합니다.

프롬프트로 역할 할당하기

이 모델에는 태그 문법이 없습니다 (@Image1, @Video1 같은 태그는 존재하지 않습니다). 각 자료의 역할은 자연어로 지정하며, 모델은 배열 순서에 따라 "image 1 / video 1 / audio 1" 같은 표현을 인식합니다.

자주 쓰이는 패턴:

의도권장 프롬프트 표현
image 1을 첫 프레임으로 사용"Use image 1 as the first frame of the video"
video 1로 카메라 워크 결정"Replicate video 1's camera movement and pacing"
audio 1을 BGM으로 사용"Use audio 1 as background music throughout the entire video"
image 1의 캐릭터 유지"The character's appearance stays consistent with image 1"
image 2의 스타일 전이"The overall art style references image 2's color palette and texture"

이 패턴들은 한 프롬프트 안에서 자유롭게 조합할 수 있습니다. 자료의 순서가 유효성에 영향을 주지는 않지만, 모델이 "image 1 / image 2"를 어떻게 해석하는지에는 영향을 주므로 재현성을 위해 순서를 안정적으로 유지하세요.

입력 자료 한도

이미지

제약한도
개수0~9
형식.jpeg, .png, .webp
크기한 변당 300~6000 px
종횡비0.4 ~ 2.5
이미지당 최대 용량30 MB 이하

비디오

제약한도
개수0~3
형식.mp4, .mov
클립당 길이2~15초
총 길이15초 이하
해상도480p ~ 720p
프레임 레이트24 ~ 60 FPS
클립당 최대 용량50 MB 이하

오디오

제약한도
개수0~3
형식.wav, .mp3
클립당 길이2~15초
총 길이15초 이하
클립당 최대 용량15 MB 이하

전체

제약한도
요청 본문 전체64 MB 이하 (Base64 인라인 불가)
최소 콘텐츠이미지 1개 또는 비디오 1개 이상 (오디오 단독 불가)

요청 예제

cURL — 3-모달 합성 (이미지 + 비디오 + 오디오)

curl -X POST https://api.evolink.ai/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.0-reference-to-video",
    "prompt": "Replicate video 1's first-person perspective and camera pacing. Use audio 1 as the soundtrack for the entire video. Scene: a young rider weaving through a rain-soaked city street at night, neon reflections on wet asphalt.",
    "image_urls": ["https://example.com/rider-style.jpg"],
    "video_urls": ["https://example.com/pov-reference.mp4"],
    "audio_urls": ["https://example.com/synthwave-bgm.mp3"],
    "duration": 10,
    "quality": "720p",
    "aspect_ratio": "16:9"
  }'

Python — 이미지만 (최대 9장)

import requests

response = requests.post(
    "https://api.evolink.ai/v1/videos/generations",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json"
    },
    json={
        "model": "seedance-2.0-reference-to-video",
        "prompt": "The overall art style references the color palette and texture of the 3 provided images. Scene: a small-town summer market at dusk, warm tones.",
        "image_urls": [
            "https://example.com/style-ref-1.jpg",
            "https://example.com/style-ref-2.jpg",
            "https://example.com/style-ref-3.jpg"
        ],
        "duration": 8,
        "aspect_ratio": "16:9"
    }
)

task = response.json()
print(f"Task ID: {task['id']}")

Node.js — 비디오 단독 참조 (카메라 복제)

const res = await fetch("https://api.evolink.ai/v1/videos/generations", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    model: "seedance-2.0-reference-to-video",
    prompt: "Replicate video 1's orbital camera movement and velocity curve. Subject: a classical sculpture in a museum hall at dusk.",
    video_urls: ["https://example.com/orbit-shot.mp4"],
    duration: 8,
    quality: "720p",
    aspect_ratio: "16:9"
  })
});

const task = await res.json();
console.log("Task ID:", task.id);

응답

{
    "id": "task-unified-1774857405-abc123",
    "object": "video.generation.task",
    "created": 1774857405,
    "model": "seedance-2.0-reference-to-video",
    "status": "pending",
    "progress": 0,
    "type": "video",
    "task_info": {
        "can_cancel": true,
        "estimated_time": 180,
        "video_duration": 10
    },
    "usage": {
        "billing_rule": "per_second",
        "credits_reserved": 60,
        "user_group": "default"
    }
}

과금 안내

  • 출력 영상의 duration을 기준으로 초 단위 과금
  • 참조 비디오의 입력 길이도 과금에 포함됩니다 (10초 참조 비디오는 입력 10초로 과금)
  • 오디오 생성 자체에는 추가 비용이 없습니다

FAQ

참조 자료가 출력에 그대로 등장하나요? 아니요. 모델은 이를 스타일 / 구도 / 동작 / 리듬에 대한 신호로 사용합니다. 최종 결과물은 완전히 새로 생성된 콘텐츠입니다.

참조 자료 없이 요청을 보낼 수 있나요? 가능합니다. 이 경우 순수 text-to-video처럼 동작합니다. 다만 참조 자료가 없다면 더 저렴한 text-to-video를 직접 사용하는 편이 낫습니다.

자료의 순서가 중요한가요? 네. 프롬프트에서 "video 1"이라고 하면 모델은 이를 video_urls[0]에 매핑합니다. 안정적인 순서를 유지하면 실험을 재현하기 쉽습니다.

관련 문서