Почему FFmpeg на мобильном устройстве?
Вы разрабатываете приложение для редактирования видео, и встроенных фреймворков (AVFoundation, MediaCodec) не хватает. Нужна обрезка с покадровой точностью, конкатенация нескольких роликов, аппаратное ускорение и гибкие настройки кодирования. Отправлять видео на сервер — долго и дорого, а пользователи требуют приватности. FFmpeg решает эти задачи прямо на устройстве. Мы интегрируем его в iOS, Android и Flutter, настраиваем оптимальную сборку ffmpeg-kit и подключаем аппаратные кодировщики VideoToolbox или MediaCodec. Это снижает нагрузку на CPU и ускоряет обработку в 5–10 раз. За годы работы мы провели более 50 успешных интеграций медиапроцессинга, гарантируем совместимость с требованиями App Store и Google Play — включая оптимизацию размера приложения и соблюдение лицензий.
Какие задачи решает FFmpeg на мобильном?
FFmpeg позволяет выполнять любые операции с медиафайлами: транскодирование, обрезку, конкатенацию, наложение водяных знаков, изменение громкости и многое другое. Вот типовые команды:
| Операция | Пример команды | Применение |
|---|---|---|
| Транскодирование | -c:v libx264 -preset ultrafast -crf 23 |
Сжатие видео перед загрузкой |
| Обрезка (frame-accurate) | -ss 00:00:10 -to 00:00:30 |
Создание клипов |
| Конкатенация | -f concat -safe 0 -i filelist.txt -c copy |
Объединение нескольких роликов |
| Извлечение аудио | -vn -acodec copy |
Получение дорожки для подкаста |
| Наложение водяного знака | -filter_complex "overlay=W-w-10:H-h-10" |
Брендирование контента |
| Изменение громкости | -af volume=0.5 |
Нормализация звука |
| Вставка изображения | -i image.png -filter_complex overlay |
Наложение логотипа на видео |
Для быстрой обрезки используйте -c copy — без перекодирования, точность до ключевого кадра. Для покадровой точности — без -c copy, но это дольше. В UI стоит дать выбор: «Быстрая обрезка» и «Точная обрезка».
Как выбрать оптимальную сборку ffmpeg-kit?
Выбор сборки ffmpeg-kit напрямую влияет на размер приложения и доступный функционал. Минимальная сборка (min) весит 8–12 МБ и включает базовые кодеки (H.264, AAC) — хватит для обрезки и конвертации. Если нужна поддержка HTTPS (например, загрузка файлов по сети) — выбирайте сборку https. Для работы с H.265, VP9 или аудиокодеками FLAC/opus потребуется full (~50 МБ). Для проектов под GPL-совместимой лицензией используйте full-gpl. Мы рекомендуем сборку https как оптимальный баланс функционала и размера. Подробнее о вариантах можно узнать в документации ffmpeg-kit.
| Сборка | Размер | Кодеки | Особенности |
|---|---|---|---|
| min | 8–12 МБ | H.264, AAC | Базовая, без сети |
| https | 12–15 МБ | + HTTPS | Для загрузки/скачивания |
| full | до 50 МБ | Все | Все кодеки, тяжёлая |
| full-gpl | до 50 МБ | Все | GPL-лицензия |
Как подключить FFmpeg к проекту?
iOS. ffmpeg-kit с CocoaPods — минимальная настройка за 15 минут:
// Podfile pod 'ffmpeg-kit-ios-https', '~> 6.0' // Использование FFmpegKit.executeAsync("-i input.mp4 -vn -acodec copy output.aac") { session in guard let returnCode = session?.getReturnCode() else { return } if ReturnCode.isSuccess(returnCode) { print("Готово: \(session?.getOutput() ?? "")") } else { print("Ошибка: \(session?.getLogsAsString() ?? "")") } } Android. Через Maven:
implementation("com.arthenica:ffmpeg-kit-android-https:6.0.LTS") FFmpegKit.executeAsync( "-i input.mp4 -vf scale=1280:720 -c:v libx264 -preset ultrafast -crf 23 output.mp4" ) { session -> if (ReturnCode.isSuccess(session.returnCode)) { // обрабатываем результат на main thread } } Flutter. Установка пакета ffmpeg_kit_flutter из pub.dev — Dart-обёртка, идентичная нативному API.
Мониторинг прогресса обработки
FFmpeg пишет прогресс в stderr. ffmpeg-kit предоставляет StatisticsCallback, где getTime() возвращает текущую позицию в миллисекундах. Общую длительность получаем через FFprobeKit.getMediaInformationAsync.
FFmpegKit.executeAsync(command, withCompleteCallback: { session in /* завершено */ }, withLogCallback: nil, withStatisticsCallback: { stats in guard let duration = totalDurationMs else { return } let progress = Double(stats?.getTime() ?? 0) / duration DispatchQueue.main.async { self.progressBar.progress = Float(progress) } } ) Как интегрировать FFmpeg: пошаговое руководство
- Выбор сборки. Определите необходимые кодеки и протоколы. Для типового приложения — https.
- Подключение. Добавьте зависимость в проект (CocoaPods, Maven или pub.dev). Протестируйте базовую команду, например, получение информации о файле.
- Настройка производительности. Включите аппаратное ускорение через
h264_videotoolbox(iOS) илиh264_mediacodec(Android) с fallback на программный кодек.
На iPhone 14 Pro транскодирование 1-минутного 1080p видео через libx264 ultrafast занимает 45–60 секунд. Для UX это много. Используем аппаратные кодировщики: iOS — h264_videotoolbox (через VideoToolbox) — в 5–10 раз быстрее, но меньше контроля над битрейтом. Android — h264_mediacodec (через MediaCodec) — аналогично. Добавляем fallback на программный кодек:
val command = if (isHardwareEncoderAvailable()) { "-i input.mp4 -c:v h264_mediacodec output.mp4" } else { "-i input.mp4 -c:v libx264 -preset ultrafast output.mp4" } Размер бинарника: сборка full добавляет 30–50 МБ к приложению, min — 8–12 МБ. Выбираем минимальную под конкретные задачи.
Что входит в интеграцию?
- Подбор и настройка оптимальной сборки ffmpeg-kit (с учётом лицензий и размера).
- Разработка API для команд (транскодирование, обрезка, конкатенация и т.д.).
- Интеграция мониторинга прогресса и отображения в UI.
- Поддержка аппаратного ускорения с fallback.
- Конфигурация ProGuard/R8 (Android) для минификации.
- Документация по использованию.
- Тестирование на 5+ реальных устройствах.
- Поддержка после деплоя в течение 30 дней.
Интеграция FFmpeg снижает затраты на серверную обработку до 40%, экономя бюджет на инфраструктуре. Окупается в течение 2–3 месяцев. Свяжитесь с нами для оценки вашего проекта — мы подготовим предложение за 1 день. Закажите консультацию, чтобы обсудить детали и получить индивидуальный план работ.







