Ми реалізуємо відправку відео в чаті мобільного додатку під ключ — від вибору файлу до вбудованого плеєра. Досвід показує, що необроблене відео високої роздільної здатності з камери завантажувати не можна: без транскодування та чанкованої відправки користувач чекає хвилини, а на слабкому з'єднанні отримує таймаут. Наша команда має 10+ років досвіду в iOS та Android-розробці, реалізувала 50+ інтеграцій відеозв'язку для чатів, за 5+ років на ринку ми гарантуємо стабільність і продуктивність. Процес відправки відео в чаті вимагає ретельного технічного рішення.
Чому відправка відео в чаті потребує транскодування?
Відео з iPhone 14 Pro в 4K/60fps важить ~400 МБ на хвилину. Навіть кліп на 15 секунд — 100 МБ. Завантажувати напряму неприйнятно ні за часом, ні за трафіком.
На iOS відео з PHPickerViewController або UIImagePickerController приходить у форматі MOV (HEVC або H.264). Перед завантаженням його потрібно транскодувати. Стандартний шлях — AVAssetExportSession з presetом AVAssetExportPresetMediumQuality (720p, ~2 Мбіт/с) або AVAssetExportPreset1280x720. Експорт асинхронний, займає від 2 до 30 секунд залежно від довжини кліпу та моделі пристрою. На iPhone SE 2nd gen транскодування 30-секундного відео в 720p — близько 8 секунд — Apple Developer Documentation.
На Android ситуація складніша: MediaMuxer + MediaCodec дають максимальний контроль, але потребують багато коду. У більшості проєктів використовуємо FFmpegKit (форк мобільного FFmpeg) — дозволяє задати бітрейт, роздільну здатність і кодек однією командою: -vcodec libx264 -crf 28 -vf scale=720:-2. Мінус — додає ~15 МБ до APK. Порівняно з AVAssetExportSession, FFmpegKit повільніший приблизно в 1.5 рази для коротких кліпів.
Як забезпечити відновлюване завантаження?
Відео не можна завантажувати одним запитом без підтримки відновлення. З'єднання перерветься — і весь прогрес втрачено.
Правильний підхід — multipart upload на стороні сервера (AWS S3 Multipart Upload, Cloudflare R2, або кастомне чанковане завантаження). Дійте так:
- Використовуйте multipart upload на сервері.
- Діліть файл на частини по 5–10 МБ.
- На iOS реалізуйте через
URLSessionзBackground Configuration(URLSessionConfiguration.background(withIdentifier:)): завантаження продовжується навіть після згортання додатка. - На Android —
WorkManagerзUploadWorker, який отримуєsetExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)для роботи в фоні. - При обриві — відновлюємо з останнього успішного чанка.
У React Native — react-native-background-upload або кастомний нативний модуль. Стандартний fetch з FormData не підтримує background upload на iOS.
Як скоротити час очікування користувача?
Прев'ю-кадр генеруємо до завантаження: на iOS — AVAssetImageGenerator з generateCGImagesAsynchronously, на Android — MediaMetadataRetriever.getFrameAtTime(). Кадр стискаємо до JPEG 480p і завантажуємо окремо — він з'явиться в чаті миттєво, поки відео ще завантажується.
Для відтворення в чаті не вбудовуємо повний плеєр у комірку — це вб'є продуктивність при скролі. Показуємо thumbnail з кнопкою play, по тапу відкриваємо AVPlayerViewController (iOS) або ExoPlayer (Android) поверх чату. ExoPlayer з SimpleExoPlayer і DefaultMediaSourceFactory підтримує HLS, DASH та progressive MP4 з коробки. Нативний підхід на Android з VideoView дає менше контролю над буферизацією та не підтримує HLS напряму — ExoPlayer вирішує ці проблеми краще в середньому в 2 рази за швидкістю старту потоку.
Детальніше про вибір кодека
Для проєктів з високими вимогами до якості можна використовувати HEVC замість H.264, що зменшує розмір на 30-40% при тій самій якості. Однак підтримка HEVC на деяких Android-пристроях обмежена.Обмеження та UX
Ліміт довжини відео — не технічне, а UX-рішення. Рекомендуємо 60–120 секунд для чатів. Перевищення — показуємо попередження до початку транскодування, не після.
Прогрес-бар завантаження з відображенням швидкості (2.3 МБ/с) та часу, що залишився — обов'язковий елемент. Кнопка скасування повинна зупиняти і транскодування, і upload, і видаляти тимчасові файли.
| Етап | Час (кліп 30с, 720p) |
|---|---|
| Транскодування (iPhone 14) | 3–5 с |
| Транскодування (iPhone SE 2) | 7–12 с |
| Upload 15 МБ на 10 Мбіт/с | ~12 с |
| Генерація прев'ю | < 1 с |
| Проблема | Рішення |
|---|---|
| Великий розмір файлу | Транскодування в 720p H.264 |
| Обрив з'єднання | Chunked upload з відновленням |
| Затримка відображення | Миттєве прев'ю |
Що входить у роботу
Ми надаємо: документацію по API, вихідний код модуля, налаштовані схеми авторизації для S3/GCS, інструкцію з розгортання на сервері та навчання вашого iOS/Android-розробника. Гарантуємо підтримку на етапі введення в експлуатацію. Замовте реалізацію відеозавантаження у вашому чаті — наші інженери проведуть аудит і запропонують оптимальне рішення.
Строки
Базова реалізація (вибір, транскодування, chunked upload, прев'ю, відтворення) — 3–5 днів за готового бекенду з підтримкою multipart upload. Background upload + відновлення — ще 1–2 дні. Вартість розраховується індивідуально після аналізу вимог, орієнтовний діапазон — від $500 до $1500 за базову реалізацію.
Зв'яжіться з нами для безкоштовної оцінки проєкту. Наші сертифіковані інженери проводять рев'ю інтеграції та дають рекомендації з оптимізації.







