모델 가이드

Kling Motion Control API: 캐릭터가 영상을 따라 하게 만들기

Kling Motion Control은 한 이미지의 캐릭터를 실제 영상의 움직임에 넣어 줍니다. 이 가이드는 무엇을 보내야 하는지, 초 단위 과금이 어떻게 동작하는지, 하나의 API로 Kling 3.0과 2.6 Motion Control을 호출하는 방법을 다룹니다.

모션 컨트롤이 하는 일

Kling Motion Control은 캐릭터 이미지와 움직이는 사람의 영상, 두 가지를 입력으로 받습니다. 이미지 속 캐릭터가 영상의 움직임을 같은 타이밍, 제스처, 몸짓으로 수행하는 새 클립을 만들어 줍니다. 캐릭터를 직접 촬영하지 않고도 실제 배우처럼 움직이는 댄스 챌린지, 마스코트 영상, 제품 홍보 캐릭터를 만드는 방법입니다.

Revana는 두 가지 버전을 제공합니다.

Kling Motion Control 버전 비교
모델모델 id해상도초당 가격경로
Kling 3.0 Motion Controlkling-3.0-motion-control720p, 1080p720p $0.13, 1080p $0.17경로 2개
Kling 2.6 Motion Controlkling-2.6-motion-control720p, 1080p720p $0.07, 1080p $0.12경로 2개

Kling 3.0이 더 최신 모델입니다. Kling 2.6은 720p에서 비용이 약 절반이므로, 먼저 내 영상으로 테스트해 볼 만합니다.

보내야 할 것

  • image_url: 캐릭터. 가급적 전신이 보이고, 카메라를 향하며, 단색 배경인 이미지가 좋습니다. 결과물에 등장하는 인물입니다.
  • video_url: 모션 클립. 한 사람이 선명하게 보이고 카메라가 고정된 영상이 가장 좋습니다. 결과물은 이 클립의 길이를 따릅니다.
  • resolution: 720p 또는 1080p. 매번 보내세요.
  • prompt: 선택 사항으로, 이미지에 없는 배경이나 세부 사항을 설명합니다.

두 파일 모두 API가 가져올 수 있는 링크여야 합니다. 컴퓨터의 파일을 보내려면 먼저 POST /v1/uploads로 업로드(최대 50 MB 클립)하고 반환된 링크를 사용하세요. 링크는 14일간 유효합니다.

모션 컨트롤 과금 방식 (2026년 10월)

가격은 영상 1초당이며, 길이는 모션 클립에 의해 정해지고 다음 정수 초로 올림됩니다. 7.4초 댄스 클립은 8초로 청구됩니다.

클립 길이별 Kling Motion Control 비용
모델해상도5초 클립10초 클립15초 클립
Kling 3.0 Motion Control720p$0.65$1.30$1.95
Kling 3.0 Motion Control1080p$0.85$1.70$2.55
Kling 2.6 Motion Control720p$0.35$0.70$1.05
Kling 2.6 Motion Control1080p$0.60$1.20$1.80

모션 클립을 보내기 전에 필요한 부분만 잘라 두세요. 추가되는 1초마다 청구됩니다. max_cost_usd를 클립 길이 기준으로 예상되는 최대 금액으로 설정하면, 그보다 비용이 많이 드는 작업은 실행되지 않고 거부됩니다. 실패한 작업은 무료이며, 크레딧은 $10부터 선불이고 구독은 없습니다. 요금 페이지를 참고하세요.

모션 컨트롤 클립 만들기

두 링크와 함께 POST /v1/generations를 보낸 다음, 작업이 succeeded 또는 failed 상태가 될 때까지 폴링하세요. 720p의 10초 모션 클립이라면 비용은 $1.30입니다.

cURL
export REVANA_API_KEY="sr_live_..."

# 1. Submit the job (returns 202 with the generation id)
curl https://api.revana.si/v1/generations \
  -H "Authorization: Bearer $REVANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kling-3.0-motion-control",
    "input": {
      "prompt": "The mascot dances on a sunny rooftop, city skyline behind.",
      "image_url": "https://example.com/mascot-full-body.png",
      "video_url": "https://example.com/dance-10s.mp4",
      "resolution": "720p"
    },
    "max_cost_usd": 1.6
  }'

# 2. Poll with the id from step 1 until status is "succeeded" or "failed"
curl https://api.revana.si/v1/generations/gen_01JC2V8K5T \
  -H "Authorization: Bearer $REVANA_API_KEY"
Python
import os
import time

import requests

API = "https://api.revana.si/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['REVANA_API_KEY']}"}

resp = requests.post(f"{API}/generations", headers=HEADERS, json={
    "model": "kling-3.0-motion-control",
    "input": {
        "prompt": "The mascot dances on a sunny rooftop, city skyline behind.",
        "image_url": "https://example.com/mascot-full-body.png",
        "video_url": "https://example.com/dance-10s.mp4",
        "resolution": "720p",
    },
    "max_cost_usd": 1.6,
})
resp.raise_for_status()
job = resp.json()

while job["status"] in ("queued", "running"):
    time.sleep(5)
    job = requests.get(f"{API}/generations/{job['id']}", headers=HEADERS).json()

if job["status"] == "succeeded":
    print(job["output"]["urls"], job["cost_usd"])
else:
    print("Failed:", job["error"])
Node.js
// Node 18 or later. Save as generate.mjs and run: node generate.mjs
const API = "https://api.revana.si/v1";
const headers = {
  Authorization: `Bearer ${process.env.REVANA_API_KEY}`,
  "Content-Type": "application/json",
};

const res = await fetch(`${API}/generations`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    model: "kling-3.0-motion-control",
    input: {
      prompt: "The mascot dances on a sunny rooftop, city skyline behind.",
      image_url: "https://example.com/mascot-full-body.png",
      video_url: "https://example.com/dance-10s.mp4",
      resolution: "720p",
    },
    max_cost_usd: 1.6,
  }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
let job = await res.json();

while (job.status === "queued" || job.status === "running") {
  await new Promise((r) => setTimeout(r, 5000));
  job = await (await fetch(`${API}/generations/${job.id}`, { headers })).json();
}

if (job.status === "succeeded") console.log(job.output.urls, job.cost_usd);
else console.error("Failed:", job.error);
응답
{
  "id": "gen_01JC2V8K5T",
  "model": "kling-3.0-motion-control",
  "status": "succeeded",
  "output": {
    "urls": [
      "https://cdn.revana.si/g/gen_01JC2V8K5T/0.mp4"
    ],
    "duration_s": 10
  },
  "cost_usd": 1.3,
  "attempts": 1,
  "error": null,
  "created_at": "2026-10-28T10:14:02Z",
  "completed_at": "2026-10-28T10:15:31Z"
}

깔끔한 결과를 얻으려면

  • 프레이밍을 맞추세요. 전신 캐릭터와 전신 댄스 클립은 상반신 초상화와 전신 클립의 조합보다 훨씬 잘 맞습니다.
  • 움직이는 사람은 한 명. 한 사람이 움직이는 클립을 사용하세요. 여러 사람이 나오거나 컷이 있으면 어떤 움직임을 따라 할지 혼동됩니다.
  • 카메라 고정. 고정되었거나 천천히 움직이는 카메라가 배경을 안정적으로 유지합니다.
  • 720p로 초안을 만드세요. Kling 2.6의 720p로 모션 전달을 확인한 다음, 마음에 드는 결과를 Kling 3.0의 1080p로 렌더링하세요.

Kling의 텍스트·이미지 투 비디오 모델은 Kling 3.0 API 가이드를 참고하세요. 두 모션 컨트롤 모델은 모델 페이지에 있고, 모든 필드는 문서에 있습니다. API 키를 받아 사용해 보세요.

자주 묻는 질문

Kling Motion Control은 얼마인가요?

2026년 10월 기준 Kling 3.0 Motion Control은 720p에서 초당 $0.13, 1080p에서 $0.17입니다. Kling 2.6 Motion Control은 $0.07과 $0.12입니다. 길이는 모션 클립에 의해 정해집니다.

Kling Motion Control에는 무엇이 필요한가요?

image_url에 캐릭터 이미지, video_url에 모션 클립, 그리고 720p 또는 1080p 해상도가 필요합니다. 프롬프트는 선택 사항입니다.

Kling Motion Control 영상은 얼마나 긴가요?

보내신 모션 클립의 길이와 같습니다. 클립의 초 단위로 청구되며, 올림하여 정수 초로 계산합니다.

Kling 3.0과 Kling 2.6 Motion Control은 어떻게 다른가요?

Kling 3.0이 더 최신 모델이고, Kling 2.6은 초당 비용이 더 낮습니다. 둘 다 같은 입력을 받으며 720p와 1080p를 지원합니다.

내 모션 영상을 업로드할 수 있나요?

네. POST /v1/uploads로 업로드(영상 최대 50 MB)하고, 반환된 링크를 video_url에 전달하세요.

하나의 키로 Kling Motion Control 사용해 보기

두 모션 컨트롤 모델과 그 밖의 모든 영상·이미지 모델을 하나의 API 키로. $10부터 시작하는 선불 크레딧이며, 전달된 클립에만 청구됩니다.