Реализация AI-автоматического монтажа видео в мобильном приложении
Автомонтаж — это когда пользователь загружает 20 случайных клипов с отпуска, а приложение само отбирает лучшие моменты, нарезает их под ритм музыки и выдаёт готовое видео. Технически это объединение нескольких AI-компонентов: анализ контента, beat detection, scene selection и финальная склейка.
Анализ контента клипов
Прежде чем монтировать — нужно понять, что в клипах. На каждый фрагмент запускаем:
Определение качества кадра: blurriness через Laplacian variance (cv2.Laplacian), exposure (среднее значение яркости), наличие лиц. Размытые и плохо освещённые кадры исключаем.
Highlights detection: резкая смена динамики (движение камеры, экшн), наличие лиц с эмоциями, высокий contrast — всё это повышает «score» момента.
# Backend: оценка кадра
def score_frame(frame_bgr):
gray = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2GRAY)
# Резкость
sharpness = cv2.Laplacian(gray, cv2.CV_64F).var()
# Яркость
brightness = gray.mean()
brightness_score = 1.0 - abs(brightness - 128) / 128 # 128 = оптимально
# Движение (разница с предыдущим кадром)
# motion_score = ...
total = (sharpness / 1000) * 0.4 + brightness_score * 0.3 + motion_score * 0.3
return min(total, 1.0)
Для более глубокого анализа — CLIP (OpenAI) через API: эмбеддинг кадра позволяет фильтровать по семантическому содержанию («кадры с людьми», «закаты», «еда»).
Beat detection и синхронизация с музыкой
Монтаж под ритм — главное, что отличает хорошее авто-видео от плохого. librosa на backend:
import librosa
import numpy as np
def detect_beats(audio_path):
y, sr = librosa.load(audio_path, sr=22050)
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
beat_times = librosa.frames_to_time(beat_frames, sr=sr)
return beat_times.tolist() # секунды каждого удара
Beats — это моменты склейки. Алгоритм монтажа: для каждого интервала между битами выбираем наиболее подходящий фрагмент по score, длина фрагмента = интервал между битами.
Среднее BPM поп-трека — 120–140. Интервал между битами — 0.43–0.5 сек. Это короткие cuts — динамично, подходит для TikTok/Reels. Для лирических видео берём каждый 2-й или 4-й бит — 1–2 секунды на кадр.
Архитектура мобильного клиента
Мобильное приложение отвечает за:
- Выбор клипов из галереи (несколько одновременно —
PHPickerViewControllerна iOS 14+,PhotoPickerна Android API 33+) - Загрузку на backend (multipart upload с прогрессом)
- Выбор музыки (из библиотеки или генерация через AI)
- Отображение прогресса монтажа
- Воспроизведение и сохранение результата
// iOS: многофайловый upload с прогрессом
class VideoUploadService {
func uploadClips(_ urls: [URL]) -> AsyncStream<UploadProgress> {
AsyncStream { continuation in
Task {
for (index, url) in urls.enumerated() {
let data = try! Data(contentsOf: url)
try await uploadSingle(data: data, name: "clip_\(index).mp4")
continuation.yield(UploadProgress(completed: index + 1, total: urls.count))
}
continuation.finish()
}
}
}
}
Upload крупных файлов — через URLSession background upload (URLSessionConfiguration.background). Не теряет загрузку при сворачивании приложения.
Backend: склейка через FFmpeg
После анализа и выбора фрагментов backend строит FFmpeg команду:
# Конкатенация через concat demuxer
ffmpeg -f concat -safe 0 -i playlist.txt \
-i background_music.mp3 \
-shortest \
-c:v libx264 -crf 20 -preset fast \
-c:a aac -b:a 192k \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
output.mp4
playlist.txt содержит timestamps каждого клипа:
file '/tmp/clip_3.mp4'
inpoint 12.4
outpoint 13.1
file '/tmp/clip_7.mp4'
inpoint 5.2
outpoint 5.7
Время обработки на сервере — 30–120 секунд в зависимости от объёма исходников и длины результата.
Настройки стиля монтажа
Хороший UX даёт пользователю несколько пресетов:
| Стиль | BPM | Длина cuts | Переходы |
|---|---|---|---|
| Dynamic | 130–140 | 0.4–0.8 сек | Hard cut |
| Cinematic | 80–100 | 2–4 сек | Fade, dissolve |
| Lyric | 90–110 | 1.5–3 сек | Slow fade |
| Story | 100–120 | 1–2 сек | Cut + slight zoom |
Настройки передаются на backend вместе с запросом на монтаж.
Сроки
Базовый автомонтаж (загрузка клипов, beat-sync, склейка) — 2–3 недели. Полная реализация с анализом контента через CLIP, стилями монтажа, AI-музыкой и on-device предпросмотром — 6–8 недель. Стоимость рассчитывается индивидуально.







