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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також