Чому 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 на програмний кодек.
Наприклад, у нашому проекті для відеоредактора ми зіткнулися з повільною обробкою: транскодування 1-хвилинного відео 1080p через libx264 ultrafast на iPhone 14 Pro займало 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 день. Замовте консультацію, щоб обговорити деталі та отримати індивідуальний план робіт.







