Розробка мобільного додатку для стриміингу відео
Відеостріміингове додаток — це не «AVPlayer + список відео». Це CDN-інтеграція, адаптивний бітрейт, DRM, аналітика якості відтворення (QoE), offline-завантаження та каталог з пошуком. Кожна крупна частина системи має нетривіальні технічні рішення.
Адаптивний стриміинг: HLS та DASH
HLS (HTTP Live Streaming) — стандарт Apple, нативна підтримка на iOS та macOS. На Android підтримується через ExoPlayer (Media3). DASH (Dynamic Adaptive Streaming over HTTP) — відкритий стандарт, краще підтримується на Android, на iOS — через ExoPlayer у WKWebView чи сторонні плеєри.
Для кроссплатформенного — HLS як основний: працює нативно на iOS, ExoPlayer обробляє його на Android без додаткового налаштування.
Сервер транскодує в кілька renditions: 360p/500кбіт, 720p/2.5Мбіт, 1080p/5Мбіт, 4K/15Мбіт. ABR (Adaptive Bitrate) на клієнті — ExoPlayer використовує AdaptiveTrackSelection з DefaultBandwidthMeter. AVPlayer на iOS — вбудований алгоритм, налаштовується через AVPlayerItem.preferredForwardBufferDuration та AVPlayerItem.preferredMaximumResolution.
// Android ExoPlayer — налаштування ABR та буферизації
val trackSelector = DefaultTrackSelector(context).apply {
setParameters(
buildUponParameters()
.setMaxVideoSizeSd() // обмежити 480p на слабих мережах
.setMinVideoBitrate(500_000)
.setForceHighestSupportedBitrate(false)
)
}
val loadControl = DefaultLoadControl.Builder()
.setBufferDurationsMs(
DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
30_000, // максимальний буфер 30 секунд
1500, // буфер для старту
3000 // буфер для возобновлення
).build()
val player = ExoPlayer.Builder(context)
.setTrackSelector(trackSelector)
.setLoadControl(loadControl)
.build()
DRM: захист платного контенту
FairPlay (iOS) та Widevine (Android) — обов'язкові для VOD-платформи з монетизацією. Схема: при старті воспроизведення клієнт отримує license challenge → відправляє на DRM license server → отримує ліцензію → розшифровує потік.
Widevine Level 1 (L1) вимагає TEE — доступна на більшості сучасних Snapdragon/Exynos Android. L3 — програмна захист, працює везде, менш надійна. Перевірити рівень: MediaDrm.getPropertyString(MediaDrm.PROPERTY_SECURITY_LEVEL).
DRM license server: власний (Shaka Packager + Shaka Streamer), Axinom, BuyDRM, або хмарні провайдери (AWS Elemental MediaConvert + AWS License Server, Azure Media Services).
Офлайн-перегляд з DRM. iOS: AVAssetDownloadTask з FairPlay offline ліцензією (persistent). Android: ExoPlayer DownloadManager + offline Widevine ліцензія через OfflineLicenseHelper. Ліцензія має строк дії — врахувати при продленні підписки та скасуванні.
Каталог та пошук
Каталог — Elasticsearch для повнотекстового пошуку з multi_match по title, description, cast. Фасетний пошук: жанри, рік, рейтинг — aggregations + filters. Автодоповнення — edge_ngrams analyzer.
На мобільному: lazy loading постерів через Glide/Coil (Android) чи Kingfisher/Nuke (iOS) з DownsamplingImageProcessor — постери 1920×1080 не потрібні в сітці 3×3.
Персоналізація: історія переглядів, watchlist, «продовжити перегляд» — часто backend-логіка з Redis кешем. На клієнті — синхронізація при кожному відкриванні + локальний стан через CoreData/Room.
Якість відтворення (QoE)
QoE-метрики — обов'язкова аналітика для стримінгу:
- Buffering ratio: час буферизації / час відтворення. Норма < 1%.
- Startup time: від нажатия Play до першого кадру. Норма < 2 секунди.
- Bitrate switches: кількість переключень ABR. Занадто часто — нестабільна мережа чи погано налаштований ABR.
- Error rate: 4xx/5xx від manifest/segment CDN.
Android: AnalyticsListener ExoPlayer — всі события з таймстемпами. iOS: AVPlayerItemAccessLog, AVPlayerItemErrorLog. Агрегуємо через Firebase Analytics, Mixpanel чи власний pipeline.
Cast та AirPlay
Chromecast: Google Cast SDK на Android та iOS. GCKSessionManager + GCKRemoteMediaClient для керування відтворенням на TV. Вимагає Google Cast Framework — додає ~1.5 МБ.
AirPlay на iOS: працює з коробки через AVPlayer + MPNowPlayingInfoCenter. Впевніться, що AVPlayerItem.externalPlaybackVideoGravity налаштований та allowsExternalPlayback = true.
Субтитри
WebVTT (preferred) чи SRT — формати субтитрів у HLS. ExoPlayer підтримує обидва нативно. iOS: AVAsset + AVMediaCharacteristicLegible трек. Стилізація через AVTextStyleRule на iOS, SubtitleView styling на Android.
Кілька доріжок: альтернативний аудіо через HLS EXT-X-MEDIA теги.
Графіки
MVP з HLS, каталогом та базовим пошуком без DRM: 4–6 тижнів. Повнофункціональна платформа з DRM, offline, Cast/AirPlay, QoE-аналітикою: 3–5 місяців. Вартість розраховується індивідуально після аналізу вимог.







