예제: 이미지-투-비디오 생성
Atlas Cloud API를 사용한 이미지 기반 동영상 생성 완전 예제
개요
이 튜토리얼에서는 완전한 이미지-투-비디오 워크플로우를 시연합니다: 소스 이미지 업로드, 이미지로부터 동영상 생성, 결과 조회.
사전 요구 사항
- API 키가 있는 Atlas Cloud 계정
- 소스 이미지 파일 (JPEG, PNG 또는 WebP)
- Python 3.7+ 및
requests라이브러리
Python 전체 예제
import requests
import time
import os
API_KEY = os.environ.get("ATLASCLOUD_API_KEY", "your-api-key")
BASE_URL = "https://api.atlascloud.ai/api/v1"
def upload_image(file_path):
"""로컬 이미지를 업로드하고 임시 URL을 받습니다."""
with open(file_path, "rb") as f:
response = requests.post(
f"{BASE_URL}/model/uploadMedia",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": f}
)
response.raise_for_status()
url = response.json().get("url")
print(f"Uploaded: {url}")
return url
def generate_video(image_url, prompt, model="kling-v2.0"):
"""이미지로부터 동영상 생성 작업을 제출합니다."""
response = requests.post(
f"{BASE_URL}/model/generateVideo",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": model,
"prompt": prompt,
"image_url": image_url
}
)
response.raise_for_status()
return response.json()["data"]["id"]
def wait_for_result(prediction_id, interval=5, timeout=300):
"""타임아웃과 함께 생성 결과를 폴링합니다."""
elapsed = 0
while elapsed < timeout:
response = requests.get(
f"{BASE_URL}/model/prediction/{prediction_id}",
headers={"Authorization": f"Bearer {API_KEY}"}
)
result = response.json()
status = result["data"]["status"]
if status == "completed":
return result["data"]["outputs"][0]
elif status == "failed":
raise Exception(f"Failed: {result['data'].get('error')}")
print(f" Status: {status} ({elapsed}s)")
time.sleep(interval)
elapsed += interval
raise TimeoutError("Generation timed out")
# 1단계: 소스 이미지 업로드
print("Step 1: Uploading image...")
image_url = upload_image("my_photo.jpg")
# 2단계: 동영상 생성
prompt = "The person slowly turns their head and smiles, camera zooms in slightly"
print(f"Step 2: Generating video with prompt: {prompt}")
prediction_id = generate_video(image_url, prompt)
print(f"Task submitted: {prediction_id}")
# 3단계: 결과 대기
print("Step 3: Waiting for video...")
video_url = wait_for_result(prediction_id)
print(f"Video ready: {video_url}")Node.js 전체 예제
import fs from "fs";
const API_KEY = process.env.ATLASCLOUD_API_KEY || "your-api-key";
const BASE_URL = "https://api.atlascloud.ai/api/v1";
async function uploadImage(filePath) {
const formData = new FormData();
formData.append("file", new Blob([fs.readFileSync(filePath)]));
const response = await fetch(`${BASE_URL}/model/uploadMedia`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}` },
body: formData,
});
if (!response.ok) throw new Error(`Upload failed: ${response.status}`);
const { url } = await response.json();
console.log(`Uploaded: ${url}`);
return url;
}
async function generateVideo(imageUrl, prompt, model = "kling-v2.0") {
const response = await fetch(`${BASE_URL}/model/generateVideo`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ model, prompt, image_url: imageUrl }),
});
if (!response.ok) throw new Error(`Generate failed: ${response.status}`);
return (await response.json()).data.id;
}
async function waitForResult(predictionId, interval = 5000, timeout = 300000) {
const start = Date.now();
while (Date.now() - start < timeout) {
const response = await fetch(
`${BASE_URL}/model/prediction/${predictionId}`,
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
const result = await response.json();
if (result.data.status === "completed") return result.data.outputs[0];
if (result.data.status === "failed") throw new Error(result.data.error);
console.log(` Status: ${result.data.status}`);
await new Promise((r) => setTimeout(r, interval));
}
throw new Error("Timeout");
}
// 워크플로우 실행
console.log("Step 1: Uploading image...");
const imageUrl = await uploadImage("my_photo.jpg");
console.log("Step 2: Generating video...");
const predictionId = await generateVideo(
imageUrl,
"The person slowly turns and smiles, gentle camera movement"
);
console.log("Step 3: Waiting for result...");
const videoUrl = await waitForResult(predictionId);
console.log(`Video ready: ${videoUrl}`);팁
- 동영상 모델: 각 모델은 다른 강점을 가지고 있습니다 — Kling은 품질, Seedance는 모션, Vidu는 시네마틱 스타일에 뛰어납니다
- 모션 프롬프트: 원하는 움직임, 카메라 모션, 씬 전환을 설명하세요
- 이미지 품질: 고품질 소스 이미지일수록 일반적으로 더 나은 동영상 결과를 생성합니다
- 생성 시간: 동영상 생성은 모델과 파라미터에 따라 일반적으로 30초에서 3분이 소요됩니다
- 폴링 간격: 불필요한 API 호출을 줄이기 위해 동영상에는 5초 간격을 사용하세요 (이미지의 2초 대비)
다음 단계
- 텍스트-투-이미지 예제 — AI로 소스 이미지 생성
- 동영상 생성 모델 — 모든 동영상 모델 탐색
- 파일 업로드 — 파일 업로드에 대해 자세히 알아보기
- 예측 — 비동기 작업 흐름 이해하기