Runway Gen-4
Лучший для: профессиональный контент, точный контроль камеры, API
API: ✅ Официальный
Сильная сторона: Camera Controls, Motion Brush
Слабая сторона: дорого для больших объёмов
Цена: от $15/мес

2026 год — это момент, когда AI-генерация видео перешла из “вау, прикольная демка” в рабочий инструмент. Уже сейчас YouTube-каналы используют Runway для B-roll, маркетологи создают рекламные ролики за часы вместо недель, а инди-разработчики делают трейлеры для игр без единого дня съёмок.
Для разработчика и контент-мейкера это открывает возможности:
Главные игроки на арене: Runway Gen-4, Kling AI 2.0, Sora (OpenAI), Pika 2.2. У каждого своя ниша.
Runway — самый известный AI-видеогенератор с API, который используют профессионалы в Голливуде и крупных студиях. Флагманская модель — Gen-4 Turbo (начало 2026).
| Планr | Цена | Кредиты/мес | Секунды видео |
|---|---|---|---|
| Free | $0 | 125 | ~25–50 сек |
| Standard | $15/мес | 625 | ~125–250 сек |
| Pro | $35/мес | 2250 | ~450–900 сек |
| Unlimited | $95/мес | ∞ (720p) | Без лимита |
| Enterprise | Custom | Custom | 4K, приоритет |
Runway предоставляет официальный REST API для text-to-video и image-to-video генерации.
import osimport timeimport requests
RUNWAY_API_KEY = os.environ["RUNWAY_API_KEY"]BASE_URL = "https://api.runwayml.com/v1"
HEADERS = { "Authorization": f"Bearer {RUNWAY_API_KEY}", "Content-Type": "application/json", "X-Runway-Version": "2024-11-06"}
def text_to_video( prompt: str, duration: int = 5, # 5 или 10 секунд ratio: str = "1280:720", # "1280:720", "720:1280", "1104:832" model: str = "gen4_turbo") -> str: """Генерация видео из текста. Возвращает URL результата."""
payload = { "model": model, "promptText": prompt, "duration": duration, "ratio": ratio, }
# Запускаем задачу response = requests.post( f"{BASE_URL}/image_to_video", # Endpoint для gen4 json=payload, headers=HEADERS ) response.raise_for_status() task = response.json() task_id = task["id"]
print(f"Задача запущена: {task_id}") return poll_task(task_id)
def image_to_video( image_url: str, prompt: str = "", duration: int = 5, ratio: str = "1280:720") -> str: """Анимация статичного изображения."""
payload = { "model": "gen4_turbo", "promptImage": image_url, # URL или base64 "promptText": prompt, # Описание движения (опционально) "duration": duration, "ratio": ratio, }
response = requests.post( f"{BASE_URL}/image_to_video", json=payload, headers=HEADERS ) response.raise_for_status() task_id = response.json()["id"]
return poll_task(task_id)
def poll_task(task_id: str, timeout: int = 300) -> str: """Ждём пока видео сгенерируется. Возвращает URL."""
start = time.time() while time.time() - start < timeout: response = requests.get( f"{BASE_URL}/tasks/{task_id}", headers=HEADERS ) task = response.json() status = task["status"]
if status == "SUCCEEDED": video_url = task["output"][0] print(f"Готово! URL: {video_url}") return video_url elif status == "FAILED": raise Exception(f"Генерация провалилась: {task.get('failure', 'Unknown error')}") elif status in ("RUNNING", "PENDING"): progress = task.get("progress", 0) print(f"Прогресс: {progress:.0%}...") time.sleep(5) else: time.sleep(5)
raise TimeoutError("Видео не сгенерировалось за отведённое время")
# Использованиеvideo_url = text_to_video( prompt="A drone flying over a neon-lit cyberpunk city at night, " "rain reflecting lights on the streets below, cinematic", duration=5, ratio="1280:720")
# Скачиваем видеоimport urllib.requesturllib.request.urlretrieve(video_url, "output.mp4")print("Видео сохранено: output.mp4")const RUNWAY_API_KEY = process.env.RUNWAY_API_KEY!;const BASE_URL = "https://api.runwayml.com/v1";
const headers = { "Authorization": `Bearer ${RUNWAY_API_KEY}`, "Content-Type": "application/json", "X-Runway-Version": "2024-11-06",};
interface VideoOptions { prompt: string; duration?: 5 | 10; ratio?: "1280:720" | "720:1280" | "1104:832";}
interface ImageToVideoOptions extends VideoOptions { imageUrl: string;}
async function textToVideo(options: VideoOptions): Promise<string> { const { prompt, duration = 5, ratio = "1280:720" } = options;
const res = await fetch(`${BASE_URL}/image_to_video`, { method: "POST", headers, body: JSON.stringify({ model: "gen4_turbo", promptText: prompt, duration, ratio, }), });
const { id: taskId } = await res.json(); return pollTask(taskId);}
async function imageToVideo(options: ImageToVideoOptions): Promise<string> { const { imageUrl, prompt = "", duration = 5, ratio = "1280:720" } = options;
const res = await fetch(`${BASE_URL}/image_to_video`, { method: "POST", headers, body: JSON.stringify({ model: "gen4_turbo", promptImage: imageUrl, promptText: prompt, duration, ratio, }), });
const { id: taskId } = await res.json(); return pollTask(taskId);}
async function pollTask(taskId: string): Promise<string> { for (let i = 0; i < 60; i++) { await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(`${BASE_URL}/tasks/${taskId}`, { headers }); const task = await res.json();
if (task.status === "SUCCEEDED") { return task.output[0] as string; } else if (task.status === "FAILED") { throw new Error(`Generation failed: ${task.failure ?? "Unknown"}`); } } throw new Error("Timeout: video not ready in 300s");}
// Использованиеconst url = await textToVideo({ prompt: "A lone astronaut walking on Mars at sunset, cinematic wide shot, dust storm in the distance", duration: 5,});console.log(`Video ready: ${url}`);Kling AI от Kuaishou — главный конкурент Runway. Модель Kling 2.0 Master (2026) выдаёт видео, которое во многих тестах превосходит Runway по фотореализму и плавности движений.
| Планr | Цена | Кредиты/мес | Особенности |
|---|---|---|---|
| Free | $0 | 66/день | Watermark, 720p |
| Standard | $7/мес | 660 | Без водяного знака |
| Pro | $28/мес | 3000 | 1080p, приоритет |
| Premier | $93/мес | 9990 | 4K, API доступ |
import osimport fal_client
os.environ["FAL_KEY"] = "your_fal_key"
def generate_kling_video(prompt: str, image_url: str = None) -> str: """Генерация через Kling 2.0 via fal.ai."""
if image_url: # Image-to-video result = fal_client.subscribe( "fal-ai/kling-video/v2/master/image-to-video", arguments={ "prompt": prompt, "image_url": image_url, "duration": "5", "aspect_ratio": "16:9", "cfg_scale": 0.5, }, ) else: # Text-to-video result = fal_client.subscribe( "fal-ai/kling-video/v2/master/text-to-video", arguments={ "prompt": prompt, "duration": "5", "aspect_ratio": "16:9", "cfg_scale": 0.5, }, )
return result["video"]["url"]
# Примерurl = generate_kling_video( prompt="Close-up of coffee being poured into a cup in slow motion, " "steam rising, warm morning light, photorealistic")print(f"Видео: {url}")Sora от OpenAI — модель, которую ждали больше года. Теперь доступна в ChatGPT Plus/Pro и через API (в ограниченном доступе).
| Доступ | Лимит видео | Качество | Длина |
|---|---|---|---|
| ChatGPT Plus | 50 шт/мес | 720p | до 10 сек |
| ChatGPT Pro | 500 шт/мес | 1080p | до 20 сек |
| API (beta) | По токенам | 1080p | до 20 сек |
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# Создание задачиresponse = client.videos.generate( model="sora-1.0", prompt="A time-lapse of a city block transforming from dawn to dusk, " "people rushing, lights turning on, cinematic overhead shot", size="1280x720", duration=10, # секунды n=1,)
# Получение результата (polling)video_id = response.idprint(f"Запущено: {video_id}")# Polling через client.videos.retrieve(video_id)Pika 2.2 — лучший вариант для быстрого старта и экспериментов. Интерфейс проще, генерация быстрее, цена ниже.
| План | Цена | Кредиты/мес | Особенности |
|---|---|---|---|
| Free | $0 | 150 | Watermark, 720p |
| Basic | $8/мес | 700 | Без водяного знака |
| Standard | $28/мес | 2000 | 1080p |
| Pro | $78/мес | 10000 | 4K, API |
Runway Gen-4
Лучший для: профессиональный контент, точный контроль камеры, API
API: ✅ Официальный
Сильная сторона: Camera Controls, Motion Brush
Слабая сторона: дорого для больших объёмов
Цена: от $15/мес
Kling AI 2.0
Лучший для: реализм движений, длинные клипы, Lip Sync
API: через fal.ai / Replicate
Сильная сторона: физика, длина до 3 мин
Слабая сторона: прямой API ограничен
Цена: от $7/мес
Sora
Лучший для: сложные нарративные сцены, Storyboard
API: ⚠️ Beta-доступ
Сильная сторона: понимание физики и логики сцены
Слабая сторона: закрытый доступ, дорого
Цена: от $20/мес (ChatGPT Plus)
Pika 2.2
Лучший для: быстрые эксперименты, эффекты, маркетинг
API: ✅ Через партнёров
Сильная сторона: Pikaffects, скорость
Слабая сторона: меньше контроля над сценой
Цена: от $8/мес
| Параметр | Runway Gen-4 | Kling 2.0 | Sora | Pika 2.2 |
|---|---|---|---|---|
| Реализм | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Макс. длина | 10 сек | 3 мин* | 20 сек | 10 сек |
| Разрешение | до 4K | до 4K | 1080p | до 4K |
| Публичный API | ✅ | через fal.ai | ⚠️ Beta | ⚠️ Limited |
| Контроль камеры | ✅ | ✅ | Ограничен | ❌ |
| Text-to-Video | ✅ | ✅ | ✅ | ✅ |
| Image-to-Video | ✅ | ✅ | ✅ | ✅ |
| Lip Sync | ❌ | ✅ | ❌ | ✅ |
*через Video Extension
Генерация из текста — основной режим. Ты описываешь сцену, модель создаёт видео. Звучит просто, но детали важны.
Опиши сцену: что происходит, кто/что в кадре, где это происходит
Укажи движение: камера (pan left, zoom in, tracking shot), объекты, персонажи
Добавь стиль: cinematic, documentary, drone footage, slow motion, time-lapse
Укажи освещение: golden hour, neon lights, studio, overcast
Задай формат: соотношение сторон (16:9, 9:16, 1:1), длина
Плохо:
Город ночьюХорошо:
Aerial drone shot of Tokyo at night, camera slowly descending from above,neon signs reflecting in wet streets after rain, people with umbrellas below,bokeh lights in the background, cinematic color grading, 4K, slow motion[Тип кадра] + [Объект/сцена] + [Движение камеры] + [Движение объекта] + [Стиль/атмосфера] + [Техническое]Полезные ключевые слова:
| Тип кадра | Движение камеры | Стиль |
|---|---|---|
aerial shot | slow pan left | cinematic |
close-up | zoom in slowly | documentary |
tracking shot | orbit around | photorealistic |
wide establishing shot | handheld | slow motion |
POV shot | timelapse | film noir |
Берёшь любую картинку и превращаешь её в видео. Это одна из самых мощных фич — можно анимировать свои иллюстрации, фотографии, скриншоты.
Модель анализирует изображение и “оживляет” его, добавляя реалистичное движение. Ты можешь подсказать направление через текстовый промпт.
# Пример: анимируем сгенерированное изображение
import base64import requests
def animate_image(image_path: str, motion_prompt: str = "") -> str: """ Анимируем локальное изображение через Runway. """
# Конвертируем в base64 with open(image_path, "rb") as f: image_b64 = base64.b64encode(f.read()).decode()
# Определяем MIME тип ext = image_path.split(".")[-1].lower() mime = {"jpg": "image/jpeg", "jpeg": "image/jpeg", "png": "image/png"}.get(ext, "image/jpeg") image_data_url = f"data:{mime};base64,{image_b64}"
# Запрос к Runway payload = { "model": "gen4_turbo", "promptImage": image_data_url, "promptText": motion_prompt, "duration": 5, "ratio": "1280:720", }
response = requests.post( "https://api.runwayml.com/v1/image_to_video", json=payload, headers={ "Authorization": f"Bearer {os.environ['RUNWAY_API_KEY']}", "X-Runway-Version": "2024-11-06", } ) response.raise_for_status() task_id = response.json()["id"]
return poll_task(task_id) # функция из примера выше
# Использование: анимируем обложку статьиvideo_url = animate_image( "my_article_cover.png", motion_prompt="subtle particle effects floating upward, gentle camera zoom in")B-Roll для YouTube
Нужна подложка под закадровый голос? Генерируй тематические видео: “кофе на столе”, “руки за клавиатурой”, “ночной город”. Без съёмки, без стоков с водяными знаками.
Промо-трейлер продукта
Показываешь новое приложение или игру? Runway создаст кинематографичные кадры по концепт-артам за час вместо недели продакшена.
Интро/аутро для канала
Уникальная заставка — это 5 секунд которые зрители видят каждый раз. С AI делаешь её раз и на годы. Попробуй сгенерировать несколько вариантов.
Рекламные материалы
Маркетинг требует постоянно новый контент. Генерируй вариации для разных аудиторий, форматов и платформ быстрее, чем согласовываются брифы.
"""Полный пайплайн: текст → изображение → видео → финал.Используем GPT-4o для изображения, Runway для видео."""
import osimport base64import requestsfrom openai import OpenAI
openai_client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])RUNWAY_KEY = os.environ["RUNWAY_API_KEY"]
def generate_promo_video(concept: str, output_file: str = "promo.mp4"): """Создаём промо-видео из концепции за 3 шага."""
print(f"🎬 Создаём видео для: '{concept}'")
# Шаг 1: GPT-4o генерирует оптимальный промпт для изображения print("Step 1: Генерируем промпт для изображения...") prompt_response = openai_client.chat.completions.create( model="gpt-4o", messages=[{ "role": "user", "content": f"""Создай детальный промпт для генерации рекламного изображения.
Концепция: {concept}
Требования:- Фотореалистичный или кинематографичный стиль- Подходит для анимации (чёткий объект, понятный фон)- Широкоформатный (16:9)- Тёмная или вечерняя атмосфера
Ответь только промптом, без объяснений.""" }] ) image_prompt = prompt_response.choices[0].message.content print(f" Промпт: {image_prompt[:100]}...")
# Шаг 2: Генерируем изображение через gpt-image-1 print("Step 2: Генерируем изображение...") image_response = openai_client.images.generate( model="gpt-image-1", prompt=image_prompt, size="1792x1024", quality="high", n=1 ) image_bytes = base64.b64decode(image_response.data[0].b64_json)
# Сохраняем изображение with open("frame.png", "wb") as f: f.write(image_bytes) print(" Изображение готово: frame.png")
# Шаг 3: Анимируем через Runway print("Step 3: Анимируем изображение...") image_b64 = base64.b64encode(image_bytes).decode()
resp = requests.post( "https://api.runwayml.com/v1/image_to_video", json={ "model": "gen4_turbo", "promptImage": f"data:image/png;base64,{image_b64}", "promptText": "slow cinematic camera movement, subtle atmosphere", "duration": 5, "ratio": "1280:720" }, headers={ "Authorization": f"Bearer {RUNWAY_KEY}", "X-Runway-Version": "2024-11-06", } ) resp.raise_for_status() task_id = resp.json()["id"]
# Ждём результат import time for _ in range(60): time.sleep(5) check = requests.get( f"https://api.runwayml.com/v1/tasks/{task_id}", headers={"Authorization": f"Bearer {RUNWAY_KEY}", "X-Runway-Version": "2024-11-06"} ) task = check.json() if task["status"] == "SUCCEEDED": video_url = task["output"][0] break elif task["status"] == "FAILED": raise Exception(f"Видео не создалось: {task.get('failure')}")
# Скачиваем import urllib.request urllib.request.urlretrieve(video_url, output_file) print(f"✅ Готово! Видео сохранено: {output_file}") return output_file
# Запускgenerate_promo_video( "Новый инструмент для разработчиков — автоматизирует рутину с AI", "promo_final.mp4")Конкретность движения:
Camera slowly pulls back revealing a vast mountain landscapeЛучше чем просто “mountain landscape”.
Физические детали:
Leaves swaying gently in the breeze, water rippling in the foregroundПомогает модели понять что должно двигаться.
Кинематографические термины:
Dolly zoom effect, rack focus from foreground to background,anamorphic lens flareСтилистические референсы:
Shot in the style of a BBC nature documentaryShot like a Blade Runner 2049 sceneInstagram aesthetic, warm filtersЗадача: создать 30-секундный промо-ролик из нескольких AI-сгенерированных клипов.
Планируем сцены — разбиваем ролик на 6 клипов по 5 секунд:
Генерируем каждый клип — через Runway или Kling по отдельности
Склеиваем через FFmpeg:
# Создаём список файловcat > clips.txt << EOFfile 'clip1.mp4'file 'clip2.mp4'file 'clip3.mp4'file 'clip4.mp4'file 'clip5.mp4'file 'clip6.mp4'EOF
# Склеиваемffmpeg -f concat -safe 0 -i clips.txt -c copy promo_raw.mp4
# Добавляем плавные переходы (cross-fade 0.5 сек)ffmpeg -i promo_raw.mp4 \ -vf "fade=in:0:12,fade=out:$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 promo_raw.mp4 | awk '{print $1 * 30 - 12}'):12" \ promo_final.mp4ffmpeg -i promo_final.mp4 -i background_music.mp3 \ -c:v copy -c:a aac \ -map 0:v:0 -map 1:a:0 \ -shortest \ promo_with_music.mp4В следующих уроках разберём v0 by Vercel — как генерировать готовые UI компоненты из промпта прямо в браузере.