Разработка мобильного приложения для стриминга видео
Видеостриминговое приложение — это не «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 // буфер для возобновления после underrun
).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 на устройстве — доступен на большинстве современных Android-устройств Snapdragon/Exynos. 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 license (persistent license). Android: DownloadManager ExoPlayer + offline Widevine license через OfflineLicenseHelper. Лицензия имеет срок действия — нужно учитывать при продлении подписки и отмене.
Каталог и поиск
Каталог фильмов/сериалов — Elasticsearch для полнотекстового поиска с multi_match по title, description, cast. Фасетный поиск: жанры, год, рейтинг — aggregations + filters. Autocomplete — edge_ngrams analyzer.
На мобильном клиенте: lazy loading постеров через Glide/Coil (Android) или Kingfisher/Nuke (iOS) с DownsamplingImageProcessor — постеры 1920×1080 не нужны в сетке 3×3.
Персонализация: история просмотров, watchlist, «продолжить просмотр» — часто делается через backend-логику с кэшированием в Redis. На клиенте — синхронизация при каждом открытии приложения + local state через 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.
Subтитры и субтитры
WebVTT (preferred) или SRT — форматы субтитров в HLS. ExoPlayer поддерживает оба нативно. На iOS: AVAsset + AVMediaCharacteristicLegible track. Стилизация субтитров через AVTextStyleRule на iOS, SubtitleView styling на Android.
Множественные дорожки: несколько языков аудио через HLS alternate audio tracks, EXT-X-MEDIA тег в playlist.
Сроки
MVP с HLS стримингом, каталогом и базовым поиском без DRM: 4–6 недель. Полноценная платформа с DRM, offline, Chromecast/AirPlay, QoE-аналитикой: 3–5 месяцев. Стоимость рассчитывается индивидуально после анализа требований.







