Розробка публікування постів з відео в мобільній програмі
Відео у постах — це не просто завантаження файлу. Важливий весь шлях: вибір, обрізка, транскодування, завантаження з прогресом, генерація превью, і нарешті — відтворення у стрічці без зависання. Кожен крок має нюанси.
Вибір та обрізка відео
PHPickerViewController з filter: .videos на iOS. Для соціальних постів зазвичай обмежуйте довжину — 60–90 секунд. Перевірте тривалість через PHAsset.duration в picker до завантаження даних.
Обрізка — AVPlayerViewController з вбудованим trim editor (iOS 14+, AVPlayerViewController.allowedPictureInPictureMediaTypes), або кастомний trimmer через AVPlayer + AVPlayerLayer з drag-handles для CMTimeRange. Кастомний trimmer дає повний контроль над UI, але потребує ~2–3 днів окремої розробки.
На Android — VideoTrimmingView через MediaPlayer + MediaMetadataRetriever для генерації тайм-лайну. Або використовуйте isoviewer / mp4parser для обрізки без повного декодування.
Транскодування: обов'язково, не опціонально
Відео з камери iPhone 14 Pro у 4K/60fps — 400 МБ на хвилину. Для поста в 60 секунд це 400 МБ. Транскодуйте до завантаження.
Цільові параметри для постів: 1080p, H.264, 4–6 Мбіт/с, AAC 128 кбіт/с. Це дає ~35–45 МБ для 60-секундного кліпу — розумний компроміс між якістю та розміром.
На iOS — AVAssetExportSession з AVAssetExportPreset1920x1080:
let export = AVAssetExportSession(asset: asset, presetName: AVAssetExportPreset1920x1080)!
export.outputURL = tempOutputURL
export.outputFileType = .mp4
export.exportAsynchronously {
// completion
}
Монітор прогресу транскодування через export.progress — AVAssetExportSession немає делегата для прогресу, тільки polling. На iPhone SE 2nd gen транскодування 60-секундного відео — 20–30 секунд. Потрібен явний прогрес-індикатор, інакше користувач вважатиме, що програма зависла.
На Android — FFmpegKit для гнучкого транскодування або MediaTranscoder (Natario1) — більш сучасна бібліотека на MediaCodec без FFmpeg. MediaTranscoder важить ~500 КБ проти ~15 МБ у FFmpegKit — важливо для розміру APK.
Завантаження
Відео для поста — великий файл, завантаження повинно підтримувати возобновлення. S3 Multipart Upload: розділіть файл на частини по 5–10 МБ, завантажте кожну паралельно (2–3 паралельні запити прискорюють завантаження без перевантаження мережі).
На iOS — URLSession з BackgroundConfiguration для продовження завантаження при мінімізації. Completion handler через application(_:handleEventsForBackgroundURLSession:) в AppDelegate.
На Android — WorkManager з UploadWorker та setConstraints(Constraints.Builder().setRequiredNetworkType(CONNECTED).build()). WorkManager гарантує виконання навіть після перезавантаження пристрою — якщо користувач вийшов з програми в середині завантаження, при наступному запуску завантаження продовжиться.
Превью та плеєр у стрічці
Генеруйте кадр превью до початку завантаження — з оригінального відео через AVAssetImageGenerator (iOS) або MediaMetadataRetriever (Android), кадр на 1-й секунді. Завантажте превью окремо, швидко — користувач бачить пост у стрічці з превью, поки відео ще обробляється.
Плеєр у стрічці — автовідтворення при появі в viewport. Не використовуйте AVPlayer для кожної ячейки стрічки — один shared AVPlayer, який переназначається при скролингу (AVQueuePlayer для предзагрузки наступного). На Android — ExoPlayer з ExoPlayer.Builder().setLoadControl(DefaultLoadControl()) та PlayerView у RecyclerView. Предзагружуйте наступне відео при скролингу через MediaSource у ConcatenatingMediaSource.
Вимкнено за замовчуванням — стандарт для автовідтворення у стрічці. Звук вмикається тапом.
Часові рамки
Вибір + транскодування + завантаження + превью + відтворення у стрічці — 3–5 днів при готовому backend. Обрізка відео + фонове завантаження + оптимістичний UI — ще 2–3 дні. Вартість розраховується індивідуально.







