Dynamic Adaptive Streaming over HTTP (DASH) — это международный стандарт адаптивной потоковой передачи мультимедиа, разработанный MPEG (Moving Picture Experts Group). DASH обеспечивает доставку видео и аудио через HTTP, используя XML-описание потока в формате Media Presentation Description (MPD) и разбивая контент на сегменты различных битрейтов. По данным исследования Bitmovin Video Developer Report (2025), 58% разработчиков видео используют DASH, что делает его вторым по популярности протоколом после HLS.
Главное
MPEG-DASH (Dynamic Adaptive Streaming over HTTP) — это международный стандарт ISO/IEC 23009-1, опубликованный в 2012 году как ответ на фрагментацию проприетарных решений адаптивного стриминга. В отличие от HLS (проприетарный протокол Apple) и Smooth Streaming (Microsoft), DASH с самого начала разрабатывался как открытый, не привязанный к конкретному вендору стандарт, что обеспечило его широкую поддержку в индустрии.
Основная инновация DASH — разделение описания потока и медиа-контента. Описание потока хранится в XML-файле MPD (Media Presentation Description), который содержит всю информацию о доступных вариантах: битрейты, разрешения, кодеки, субтитры, аудио-дорожки. Медиа-контент хранится в виде отдельных сегментов (обычно fMP4), которые могут быть загружены независимо через HTTP. Такая архитектура позволяет серверной инфраструктуре быть максимально простой — любой HTTP-сервер способен раздавать DASH-контент.
Адаптивность DASH реализована через мультиплексирование вариантов одного контента. Сервер готовит несколько Representation (представлений) — копий контента с разными параметрами сжатия. Клиент анализирует пропускную способность канала и динамически переключается между представлениями, выбирая оптимальное соотношение качества и стабильности воспроизведения. По данным академического исследования (IEEE Access, 2024), DASH с алгоритмом BOLA показывает на 22% меньше переключений битрейта по сравнению с HLS при нестабильном соединении.
MPEG начал работу над DASH в 2010 году после анализа существующих решений: Apple HLS, Microsoft Smooth Streaming и Adobe HDS. Первая версия стандарта (ISO/IEC 23009-1:2012) вышла в 2012 году. Вторая версия (2014) добавила поддержку событий, улучшенную рекламную вставку и Server-Controlled Adaptation. Третья версия (2019) — поддержку HDR, 8K, тактильного видео и улучшенную интеграцию с MMT (MPEG Media Transport) для сетей 5G.
В 2024 году MPEG анонсировала DASH Next Generation, который включает поддержку нейросетевых кодеков, облачную рендеринг и оптимизацию для сценариев Extended Reality (XR). Ключевое нововведение — Neural Network-Based Video Coding (NNVC), который использует ML-модели для декодирования на стороне клиента, что может снизить битрейт на 30-50% при сохранении качества.
Процесс воспроизведения DASH-потока состоит из четырёх последовательных этапов: получение MPD, парсинг описания потока, выбор начального представления и динамическое переключение между представлениями. Каждый этап имеет свою специфику, влияющую на качество пользовательского опыта.
Плеер загружает MPD-файл по известному URL. MPD содержит XML-структуру с описанием всего потока: длительность контента, временная шкала, доступные периоды (Period), наборы адаптации (AdaptationSet) и представления (Representation) с конкретными параметрами кодирования. Плеер парсит MPD и создаёт внутреннюю модель доступных медиа-ресурсов.
Пример базового MPD-файла для VOD-контента с двумя разрешениями:
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
type="static"
mediaPresentationDuration="PT1H30M">
<Period duration="PT1H30M">
<AdaptationSet mimeType="video/mp4">
<Representation bandwidth="5000000"
width="1920" height="1080"
codecs="avc1.640028"/>
<Representation bandwidth="1000000"
width="640" height="360"
codecs="avc1.64001E"/>
</AdaptationSet>
</Period>
</MPD>
После выбора начального представления плеер начинает загружать сегменты. Каждый сегмент содержит несколько секунд контента (обычно 2-10 секунд). Плеер поддерживает буфер на несколько сегментов вперёд, что обеспечивает устойчивость к кратковременным падениям скорости сети. Алгоритм выбора представления (ABR) постоянно мониторит скорость загрузки сегментов и принимает решение о переключении между доступными битрейтами.
Современные ABR-алгоритмы для DASH, такие как BOLA (Buffer Occupancy based Lyapunov Algorithm) и Pensieve (на основе Reinforcement Learning), учитывают не только текущую пропускную способность, но и размер буфера, тип контента (спорт, новости, кино) и даже энергопотребление устройства. BOLA, входящий в состав dash.js и ExoPlayer, минимизирует количество переключений битрейта при сохранении стабильного буфера, что подтверждено исследованиями ACM (Spiteri et al., 2020).
Иерархическая структура DASH-потока организована в четыре уровня: MPD → Period → AdaptationSet → Representation. Каждый уровень добавляет уровень детализации, позволяя описывать сложные сценарии — от простого VOD до live-трансляций с рекламными вставками и мульти-ракурсным видео.
MPD — корневой элемент, описывающий всю медиа-презентацию. Атрибуты MPD определяют тип потока (static для VOD, dynamic для live), общую длительность, временную шкалу, профиль и информацию о DRM. MPD может содержать один или несколько Period, каждый из которых представляет независимый временной отрезок контента.
Period — временной сегмент презентации. Для VOD используется один Period на весь контент. Для live с рекламными вставками Period может изменяться динамически — плеер загружает обновлённый MPD и обнаруживает новый Period, соответствующий рекламному блоку. Каждый Period содержит один или несколько AdaptationSet.
AdaptationSet — группа взаимозаменяемых представлений одного типа медиа: видео, аудио, субтитры. Внутри AdaptationSet все представления отличаются только битрейтом и/или разрешением, но кодируют один и тот же контент. Важное свойство: плеер может переключаться между представлениями внутри одного AdaptationSet на границе сегментов без разрыва воспроизведения.
Representation — конкретный вариант кодирования с определённым битрейтом, разрешением и кодеком. Для каждого Representation в MPD указывается URL шаблон для загрузки сегментов. DASH использует гибкую систему адресации сегментов — через шаблоны URL с подстановкой номера сегмента и времени ($Number$, $Time$), что позволяет серверу динамически генерировать имена файлов без необходимости перечислять каждый сегмент в MPD.
Сегменты DASH могут быть двух типов: типа Segment (содержат только медиа-данные) и типа Subsegment (часть сегмента для более гранулярного доступа). Для кодирования DASH-контента используется инструментарий вроде FFmpeg или пакетных кодировщиков. Пример создания DASH-потока из входного файла:
import subprocess
subprocess.run([
"ffmpeg",
"-i", "input.mp4",
"-filter_complex",
"[0:v]split=2[v1][v2];[v1]scale=1920:1080[v1out];[v2]scale=640:360[v2out]",
"-map", "[v1out]", "-b:v:0", "5000k",
"-map", "[v2out]", "-b:v:1", "1000k",
"-map", "0:a",
"-f", "dash",
"-seg_duration", "4",
"-use_template", "1",
"-use_timeline", "1",
"dash/stream.mpd"
])
Выбор между DASH и HLS — одно из ключевых решений при проектировании системы видеостриминга. Оба протокола решают одну задачу (адаптивная HTTP-доставка видео), но имеют принципиальные различия в архитектуре, поддержке кодеков и экосистеме. Рассмотрим их по ключевым параметрам.
| Параметр | DASH | HLS |
|---|---|---|
| Стандарт | Международный (ISO/IEC 23009-1) | Проприетарный (RFC 8216, Apple) |
| Описание потока | XML (MPD) | M3U8 плейлист |
| Кодеки | Любые (H.264, HEVC, AV1, VP9) | Ограничен (H.264, HEVC, AV1 с 2023) |
| Формат сегментов | fMP4 (основной), MPEG-2 TS | MPEG-2 TS, fMP4 |
| DRM | CENC (единый для всех DRM) | FairPlay, Widevine (раздельно) |
| iOS поддержка | Через сторонние плееры | Нативная (AVPlayer, Safari) |
| Браузеры | Chrome, Firefox, Edge (через MSE) | Safari (нативно), остальные через MSE |
Ключевое преимущество DASH — независимость от кодеков. Если HLS изначально ограничивал кодеки теми, что поддерживает Apple (H.264, HEVC, и с недавнего времени AV1), то DASH может использовать любой кодек, поддерживаемый плеером: VP9/VP8 (критично для YouTube и Chrome), AV1 (для эффективности), H.264/HEVC (для совместимости). Это делает DASH предпочтительным выбором для кроссплатформенных сервисов, где требуется единый поток для всех устройств.
Недостаток DASH на iOS — отсутствие нативной поддержки в Safari и AVPlayer. Разработчикам iOS-приложений необходимо использовать сторонние HLS-совместимые плееры или библиотеки вроде libdash с интеграцией через VTDecoder. На практике это означает, что для iOS-first проектов HLS остаётся стандартом де-факто, тогда как для Android и веб-платформ DASH является более гибким и мощным решением.
Интеграция DASH в мобильные приложения зависит от платформы. На Android DASH поддерживается напрямую через ExoPlayer с модулем расширения. На iOS требуется использование сторонних библиотек, таких как libdash с интеграцией через AVFoundation или MPEGDASHPlayer. Рассмотрим практическую реализацию для обеих платформ.
ExoPlayer от Google предоставляет встроенную поддержку DASH через модуль `exoplayer-dash`. Подключение DASH-потока не отличается от других форматов — достаточно передать URI MPD-файла в MediaItem. ExoPlayer автоматически определяет формат контента и запускает соответствующий рендерер, поддерживая все стандартные ABR-алгоритмы.
val player = ExoPlayer.Builder(this).build()
val dashMediaItem = MediaItem
.Builder()
.setUri("https://example.com/dash/stream.mpd")
.setMimeType("application/dash+xml")
.build()
player.setMediaItem(dashMediaItem)
player.prepare()
player.playWhenReady = true
Common Encryption (CENC) — одна из ключевых возможностей DASH, позволяющая использовать один медиа-поток с разными DRM-системами. MPD-файл содержит XML-элементы ContentProtection с идентификаторами DRM-систем (Widevine, PlayReady, FairPlay). Клиент выбирает подходящую DRM-систему на основе своей платформы и запрашивает лицензию через лицензионный сервер.
val drmLicenseUri = Uri.parse("https://license.example.com/wv")
val drmSessionManager = DefaultDrmSessionManager
.Builder()
.setUuidAndExoMediaDrmProvider(
C.WIDEVINE_UUID,
FrameworkMediaDrm.DEFAULT_PROVIDER
)
.build(drmLicenseUri, null)
val mediaItem = MediaItem
.Builder()
.setUri("https://example.com/encrypted/stream.mpd")
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://license.example.com/wv")
.build()
)
.build()
Мобильные приложения требуют особой настройки DASH из-за ограничений пропускной способности и энергопотребления. Основные рекомендации включают: настройку минимального буфера в 2-3 сегмента для устойчивости к кратковременным падениям скорости, использование сегментов длительностью 2-4 секунды для более быстрой реакции на изменения сети, и предварительную загрузку следующего сегмента при переключении качества.
Для экономии трафика на мобильных сетях Bitmovin (2024) рекомендует использовать Content Steering — механизм, схожий с аналогичной функцией HLS, позволяющий динамически направлять клиента на оптимальный CDN-узел. DASH Content Steering описывается в спецификации ISO/IEC 23009-1:2022 и поддерживается в dash.js 4.5+ и ExoPlayer 2.18+.
Часто задаваемые вопросы
DASH — открытый международный стандарт MPEG, не привязанный к вендору. В отличие от HLS (проприетарный протокол Apple), DASH поддерживает любые кодеки, использует XML-описание потока (MPD) вместо M3U8 и обеспечивает единую систему DRM через CENC. HLS имеет нативную поддержку на iOS, DASH — более гибкий для кроссплатформенных решений.
На Android основным плеером для DASH является ExoPlayer от Google с модулем exoplayer-dash. На iOS используются сторонние решения, такие как libdash с интеграцией через AVFoundation или коммерческие плееры (THEOplayer, Bitmovin). В веб-браузерах DASH воспроизводится через dash.js с использованием MediaSource Extensions.
MPD (Media Presentation Description) — это XML-файл, который описывает структуру DASH-потока: длительность контента, доступные битрейты, разрешения, кодеки, форматы сегментов и их расположение. MPD служит точкой входа для плеера, заменяя мастер-плейлист в HLS. Без MPD-файла невозможно воспроизведение DASH-контента.
Да, DASH поддерживает как VOD, так и live-вещание. Для live используется dynamic тип MPD с автоматическим обновлением. Сервер периодически обновляет MPD, добавляя новые сегменты и удаляя устаревшие. Low-Latency DASH (LL-DASH) с chunked encoding позволяет достичь задержки 3-8 секунд, сравнимой с LL-HLS.
DASH использует Common Encryption (CENC, ISO/IEC 23001-7), который позволяет зашифровать медиа-контент один раз и дешифровать его любой DRM-системой. MPD содержит XML-элементы ContentProtection с указанием поддерживаемых DRM (Widevine, PlayReady, FairPlay). Плеер выбирает подходящую DRM на основе платформы и запрашивает лицензию через заданный URL.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также