New: Nano Banana 2.1Try the model
API Stock

영상

이미지를 비디오로

주제, 구도, 스타일을 유지하며 참조 이미지를 애니메이션으로 만드는 방법.

1분 분량2개 섹션

시작 이미지는 주제와 구도를 고정합니다. 프롬프트에는 움직임, 리듬, 바뀌면 안 되는 요소를 분명히 적어야 합니다. 짧은 애니메이션이 더 제어하기 쉽습니다.

실무 핵심

속도, 충실도, 해상도, 제어 중 무엇이 우선인지에 따라 모델을 선택하고 모든 결과의 파라미터와 버전을 저장하세요. wan2.7-video, kling-3.0-* and veo3.1-* — Image to video.

한 번의 시도에서는 한 가지만 바꾸세요. 좋은 출력은 참조가 되며 다음 반복의 가장 신뢰할 수 있는 출발점입니다.

finished와 failed를 최종 상태로 다루세요. polling 또는 webhook을 사용하고 원본 오류는 서버에 보관하며 사용자에게는 안전한 메시지만 표시하세요.

프롬프트와 API 예시

text
A matte-black espresso machine on a concrete counter with steam and morning light
text
Steam rises and drifts left, the light slowly warms, camera pushes in very
slightly. Everything else stays still.
text
A hyperrealistic macro photo of tiny, miniature surfers riding ocean waves
inside a rustic stone bathroom sink. A vintage brass faucet is running,
creating the perpetual surf. Surreal, whimsical, bright natural lighting.
The Nano Banana source frame used for the image-to-video example below.
The Nano Banana source frame used for the image-to-video example below.

Source: Google AI for Developers, used under CC BY 4.0; format and dimensions adapted.

text
A surreal, cinematic macro video. Tiny surfers ride perpetual, rolling waves
inside a stone bathroom sink. A running vintage brass faucet generates the
endless surf. The camera slowly pans across the whimsical, sunlit scene as the
miniature figures expertly carve the turquoise water.
Veo 3.1 turns the still sink scene into a controlled macro pan while preserving the miniature surfers and faucet.

Source: Google AI for Developers, used under CC BY 4.0; format and dimensions adapted.

text
Smooth continuous transition between the two framings, no cuts, natural
lighting change
text
The character turns from the window toward the camera and smiles. Room tone
and distant traffic. No cuts.
text
The character performs the motion from the reference video, keeping their own
clothing and appearance

About these samples. Ready-made examples are copied to our own storage only when their source permits reuse. The exact prompt appears above each result, and the original source and license are linked below the media.

json
{
"model": "seedance-2.0",
"input": {
"prompt": "The camera drifts left as the sun clears the ridge",
"imageWithRoles": [
{ "url": "https://example.com/dawn.jpg", "role": "first_frame" },
{ "url": "https://example.com/noon.jpg", "role": "last_frame" }
],
"resolution": "1080p",
"duration": 8,
"generateAudio": false
}
}
json
{
"model": "pixverse-v6",
"input": {
"prompt": "Slow dissolve between the two framings",
"firstFrameImage": "https://example.com/dawn.jpg",
"lastFrameImage": "https://example.com/noon.jpg",
"duration": 5,
"resolution": "720p"
}
}
json
{
"model": "wan2.7-video",
"input": {
"imageUrls": [
"https://example.com/dawn.jpg",
"https://example.com/noon.jpg"
],
"resolution": "1080p",
"duration": 5
}
}
json
{
"model": "kling-3.0-motion-control",
"input": {
"prompt": "Studio backdrop, soft key light",
"imageUrls": ["https://example.com/character.png"],
"videoUrls": ["https://example.com/dance-reference.mp4"],
"characterOrientation": "image",
"resolution": "1080p"
}
}
json
{
"model": "midjourney-video",
"input": {
"prompt": "Gentle parallax drift toward the archway",
"imageUrls": ["https://example.com/still.png"],
"videoType": "vid_1.1_i2v_720",
"motion": "high",
"batchSize": 1
}
}
json
{
"model": "midjourney-video",
"input": {
"parentTaskId": "019ca881-9503-7270-a560-f00fc2b15785",
"index": 0,
"animateMode": "auto",
"videoType": "vid_1.1_i2v_480"
}
}
sh
curl -X POST https://api.api-stock.com/api/v1/generation/create \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"model": "veo3.1-fast",
"input": {
"prompt": "The gulls lift off and the boat rocks in the swell",
"urls": ["https://example.com/harbour.jpg"],
"generationType": "frame",
"aspectRatio": "16:9"
}
}'
json
{
"code": 200,
"data": {
"taskId": "019ca8a1-1c40-73f2-9b6d-4a01d8e2f7c3",
"status": "not_started",
"createdAt": "2026-02-28T12:04:11.000Z"
}
}
ts
const BASE = "https://api.api-stock.com/api/v1";
const KEY = process.env.API_STOCK_KEY!;
async function animate(imageUrl: string, prompt: string) {
const create = await fetch(`${BASE}/generation/create`, {
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "veo3.1-fast",
input: {
prompt,
urls: [imageUrl],
generationType: "frame",
aspectRatio: "16:9",
},
}),
});
const created = await create.json();
if (!create.ok) {
throw new Error(`${created.error.code}: ${created.error.message}`);
}
const taskId: string = created.data.taskId;
for (;;) {
await new Promise((r) => setTimeout(r, 10_000));
const res = await fetch(`${BASE}/task/status/${taskId}`, {
headers: { Authorization: `Bearer ${KEY}` },
});
const body = await res.json().catch(() => null);
if (!res.ok) {
const message = body?.error?.message ?? `${res.status} ${res.statusText}`;
throw new Error(message);
}
const { data } = body;
if (data.status === "finished") return data.files[0].fileUrl;
if (data.status === "failed" || data.status === "expired") {
throw new Error(data.errorMessage);
}
}
}
const url = await animate(
"https://example.com/harbour.jpg",
"The gulls lift off and the boat rocks in the swell",
);
console.log(url); // → https://storage.api-stock.com/generated/video-...mp4
json
{
"code": 200,
"data": {
"taskId": "019ca8a1-1c40-73f2-9b6d-4a01d8e2f7c3",
"status": "finished",
"files": [
{
"fileUrl": "https://storage.api-stock.com/generated/video-9f31c2.mp4",
"fileType": "video"
}
],
"createdTime": "2026-02-28T12:04:11.000Z"
}
}

직접 발급한 키로 실행해 보세요

API Stock 카탈로그에서 모델과 가격을 확인하고 브라우저나 API로 사용해 보세요.

이어서 읽기