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) добави поддръжка за събития, подобрено вмъкване на реклами и адаптация, контролирана от сървъра. Третата версия (2019) — поддръжка за HDR, 8K, тактилно видео и подобрена интеграция с MMT (MPEG Media Transport) за 5G мрежи.
През 2024 г. MPEG обяви DASH Next Generation, който включва поддръжка на невронни мрежови кодеци, облачно рендериране и оптимизация за сценарии с разширена реалност (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 до живи предавания с рекламни вмъквания и мулти-ъглово видео.
MPD — коренен елемент, който описва цялата медийна презентация. Атрибутите на MPD определят типа поток (static за VOD, dynamic за живо предаване), общата продължителност, времевата скала, профила и информацията за DRM. MPD може да съдържа един или повече Period-а, всеки от които представлява независим времеви интервал от съдържанието.
Period — времеви сегмент от презентацията. За VOD се използва един Period за цялото съдържание. За живо предаване с рекламни вмъквания, Period може да се променя динамично — плейърът зарежда актуализирания MPD и открива нов Period, съответстващ на рекламния блок. Всеки Period съдържа един или повече AdaptationSet-а.
AdaptationSet — група от взаимозаменяеми представяния от един и същ тип медия: видео, аудио, субтитри. В рамките на AdaptationSet всички представяния се различават само по битрейт и/или резолюция, но кодират едно и също съдържание. Важно свойство: плейърът може да превключва между представянията в рамките на един и същ AdaptationSet на границата на сегментите без прекъсване на възпроизвеждането.
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, 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, така и живи предавания. За живи предавания се използва dynamic тип MPD с автоматично обновяване. Сървърът периодично обновява MPD, добавяйки нови сегменти и премахвайки остарели. Low-Latency DASH (LL-DASH) с кодиране на парчета позволява постигане на забавяне от 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също