Реализация потокового воспроизведения видео (HLS/DASH) в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация потокового воспроизведения видео (HLS/DASH) в мобильном приложении
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация потокового воспроизведения видео (HLS/DASH) в мобильном приложении

HLS и DASH — протоколы адаптивного стриминга. Плеер загружает не один файл, а манифест с сегментами, и динамически переключается между качествами в зависимости от скорости сети. Это не простая загрузка MP4 — здесь есть буферизация, ABR-алгоритмы и обработка сетевых ошибок.

HLS vs DASH: что выбрать

Параметр HLS DASH
Нативная поддержка iOS Да (AVFoundation) Нет (нужна библиотека)
Нативная поддержка Android Нет (нужен ExoPlayer) Нет (нужен ExoPlayer)
Задержка (стандарт) 6–30 с 2–10 с
Low-Latency HLS/DASH LL-HLS: ~2 с LL-DASH: ~1–3 с
DRM поддержка FairPlay (iOS), Widevine Widevine, PlayReady

На практике: если аудитория iOS-dominant и нет DRM — HLS без сторонних библиотек. Если кросс-платформа и нужна минимальная задержка — DASH через ExoPlayer/Shaka.

iOS: AVPlayer + HLS

AVPlayer воспроизводит HLS нативно. Создаём AVPlayerItem(url: m3u8Url):

let asset = AVURLAsset(url: hlsURL, options: [
    "AVURLAssetHTTPHeaderFieldsKey": ["Authorization": "Bearer \(token)"]
])
let item = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: item)

Мониторинг буферизации — KVO на item.isPlaybackLikelyToKeepUp и item.loadedTimeRanges. Когда isPlaybackLikelyToKeepUp == false — показываем спиннер, при true — скрываем.

Предзагрузка следующего видео: создаём AVPlayerItem заранее, добавляем в AVQueuePlayer — первый сегмент следующего видео начнёт загружаться в фоне.

Android: ExoPlayer + HLS/DASH

val player = ExoPlayer.Builder(context).build()

// HLS
val hlsItem = MediaItem.Builder()
    .setUri("https://example.com/stream.m3u8")
    .build()

// DASH
val dashItem = MediaItem.Builder()
    .setUri("https://example.com/manifest.mpd")
    .build()

player.setMediaItem(hlsItem)
player.prepare()
player.play()

ExoPlayer автоматически выбирает HlsMediaSource или DashMediaSource по расширению URL. Для явного указания или кастомных заголовков:

val dataSourceFactory = DefaultHttpDataSource.Factory()
    .setDefaultRequestProperties(mapOf("Authorization" to "Bearer $token"))
val hlsSource = HlsMediaSource.Factory(dataSourceFactory)
    .createMediaSource(MediaItem.fromUri(uri))

Адаптивный битрейт

По умолчанию ExoPlayer использует AdaptiveTrackSelection — переключает качество на границах сегментов (обычно каждые 2–10 с). Настройка минимального качества:

val trackSelector = DefaultTrackSelector(context)
trackSelector.parameters = trackSelector.buildUponParameters()
    .setMaxVideoSizeSd() // не выше 480p на слабых устройствах
    .build()

На iOS — AVPlayerItem.preferredPeakBitRate = 2_000_000 ограничивает верхний битрейт, полезно для экономии трафика.

Обработка ошибок сети

Сеть нестабильна — сегмент не загрузился, манифест вернул 403, CDN дал 5xx. ExoPlayer повторяет запросы автоматически с экспоненциальной задержкой (DefaultLoadErrorHandlingPolicy). Кастомная политика:

class RetryPolicy : DefaultLoadErrorHandlingPolicy() {
    override fun getRetryDelayMsFor(loadErrorInfo: LoadErrorInfo) =
        if (loadErrorInfo.errorCount < 5) 1000L * loadErrorInfo.errorCount else RETRY_DELAY_UNSET
}

На iOS: AVPlayerItem.status == .failedplayer.currentItem?.error — читаем NSError, показываем кнопку «Повторить».

Сроки

HLS-плеер на одной платформе с ABR и обработкой ошибок — 2 дня. Кросс-платформенный (iOS + Android) с DASH, DRM и ручным выбором качества — 4–5 дней.