Dynamic Adaptive Streaming over HTTP (DASH) to międzynarodowy standard adaptacyjnego przesyłania multimediów strumieniowo, opracowany przez MPEG (Moving Picture Experts Group). DASH zapewnia dostarczanie wideo i audio przez HTTP, wykorzystując opis strumienia w formacie XML o nazwie Media Presentation Description (MPD) i dzieląc treść na segmenty o różnych przepływnościach. Według badania Bitmovin Video Developer Report (2025), 58% programistów wideo używa DASH, co czyni go drugim najpopularniejszym protokołem po HLS.
Najważniejsze
MPEG-DASH (Dynamic Adaptive Streaming over HTTP) — to międzynarodowy standard ISO/IEC 23009-1, opublikowany w 2012 roku jako odpowiedź na fragmentację zastrzeżonych rozwiązań adaptacyjnego strumieniowania. W przeciwieństwie do HLS (zastrzeżony protokół Apple) i Smooth Streaming (Microsoft), DASH od samego początku był opracowywany jako otwarty, niezwiązany z konkretnym dostawcą standard, co zapewniło jego szerokie wsparcie w branży.
Główną innowacją DASH jest rozdzielenie opisu strumienia i treści multimedialnych. Opis strumienia jest przechowywany w pliku XML MPD (Media Presentation Description), który zawiera wszystkie informacje o dostępnych wariantach: przepływności, rozdzielczości, kodeki, napisy, ścieżki audio. Treści multimedialne są przechowywane w postaci oddzielnych segmentów (zwykle fMP4), które mogą być pobierane niezależnie przez HTTP. Taka architektura pozwala, aby infrastruktura serwerowa była maksymalnie prosta — każdy serwer HTTP jest w stanie dostarczać treść DASH.
Adaptacyjność DASH jest realizowana przez multipleksowanie wariantów tej samej treści. Serwer przygotowuje kilka reprezentacji — kopii treści z różnymi parametrami kompresji. Klient analizuje przepustowość kanału i dynamicznie przełącza się między reprezentacjami, wybierając optymalny stosunek jakości do stabilności odtwarzania. Według badań akademickich (IEEE Access, 2024), DASH z algorytmem BOLA wykazuje o 22% mniej przełączeń przepływności w porównaniu z HLS przy niestabilnym połączeniu.
MPEG rozpoczął prace nad DASH w 2010 roku po analizie istniejących rozwiązań: Apple HLS, Microsoft Smooth Streaming i Adobe HDS. Pierwsza wersja standardu (ISO/IEC 23009-1:2012) została wydana w 2012 roku. Druga wersja (2014) dodała obsługę zdarzeń, ulepszone wstawianie reklam i adaptację sterowaną przez serwer. Trzecia wersja (2019) — obsługę HDR, 8K, wideo dotykowego i lepszą integrację z MMT (MPEG Media Transport) dla sieci 5G.
W 2024 roku MPEG ogłosił DASH Next Generation, który obejmuje obsługę kodeków neuronowych, renderowanie w chmurze i optymalizację dla scenariuszy Extended Reality (XR). Kluczową innowacją jest Neural Network-Based Video Coding (NNVC), który wykorzystuje modele ML do dekodowania po stronie klienta, co może zmniejszyć przepływność o 30-50% przy zachowaniu jakości.
Proces odtwarzania strumienia DASH składa się z czterech kolejnych etapów: pobranie MPD, parsowanie opisu strumienia, wybór początkowej reprezentacji i dynamiczne przełączanie między reprezentacjami. Każdy etap ma swoją specyfikę wpływającą na jakość doświadczenia użytkownika.
Odtwarzacz ładuje plik MPD pod znanym adresem URL. MPD zawiera strukturę XML z opisem całego strumienia: czas trwania treści, skalę czasową, dostępne okresy (Period), zestawy adaptacji (AdaptationSet) i reprezentacje (Representation) z konkretnymi parametrami kodowania. Odtwarzacz parsuje MPD i tworzy wewnętrzny model dostępnych zasobów multimedialnych.
Przykład podstawowego pliku MPD dla treści VOD z dwoma rozdzielczościami:
<?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>
Po wyborze początkowej reprezentacji odtwarzacz zaczyna ładować segmenty. Każdy segment zawiera kilka sekund treści (zwykle 2-10 sekund). Odtwarzacz utrzymuje bufor na kilka segmentów do przodu, co zapewnia odporność na krótkotrwałe spadki prędkości sieci. Algorytm wyboru reprezentacji (ABR) stale monitoruje prędkość ładowania segmentów i podejmuje decyzję o przełączaniu między dostępnymi przepływnościami.
Nowoczesne algorytmy ABR dla DASH, takie jak BOLA (Buffer Occupancy based Lyapunov Algorithm) i Pensieve (oparty na Reinforcement Learning), uwzględniają nie tylko bieżącą przepustowość, ale także rozmiar bufora, rodzaj treści (sport, wiadomości, film), a nawet zużycie energii urządzenia. BOLA, wchodzący w skład dash.js i ExoPlayer, minimalizuje liczbę przełączeń przepływności przy zachowaniu stabilnego bufora, co zostało potwierdzone badaniami ACM (Spiteri et al., 2020).
Hierarchiczna struktura strumienia DASH jest zorganizowana na czterech poziomach: MPD → Period → AdaptationSet → Representation. Każdy poziom dodaje poziom szczegółowości, umożliwiając opis złożonych scenariuszy — od prostego VOD po transmisje na żywo z wstawkami reklamowymi i wideo z wielu kamer.
MPD — element główny, opisujący całą prezentację multimedialną. Atrybuty MPD określają typ strumienia (static dla VOD, dynamic dla transmisji na żywo), całkowity czas trwania, skalę czasową, profil i informacje o DRM. MPD może zawierać jeden lub więcej okresów Period, z których każdy reprezentuje niezależny przedział czasowy treści.
Period — segment czasowy prezentacji. Dla VOD używany jest jeden Period na całą treść. Dla transmisji na żywo z wstawkami reklamowymi Period może zmieniać się dynamicznie — odtwarzacz ładuje zaktualizowany MPD i wykrywa nowy Period odpowiadający blokowi reklamowemu. Każdy Period zawiera jeden lub więcej zestawów AdaptationSet.
AdaptationSet — grupa wzajemnie zastępowalnych reprezentacji jednego typu mediów: wideo, audio, napisy. Wewnątrz AdaptationSet wszystkie reprezentacje różnią się tylko przepływnością i/lub rozdzielczością, ale kodują tę samą treść. Ważna właściwość: odtwarzacz może przełączać się między reprezentacjami wewnątrz jednego AdaptationSet na granicy segmentów bez przerwy w odtwarzaniu.
Representation — konkretny wariant kodowania z określoną przepływnością, rozdzielczością i kodekiem. Dla każdej reprezentacji w MPD podawany jest szablon URL do ładowania segmentów. DASH używa elastycznego systemu adresowania segmentów — przez szablony URL z podstawianiem numeru segmentu i czasu ($Number$, $Time$), co pozwala serwerowi dynamicznie generować nazwy plików bez konieczności wymieniania każdego segmentu w MPD.
Segmenty DASH mogą być dwojakiego rodzaju: typu Segment (zawierają tylko dane multimedialne) i typu Subsegment (część segmentu dla bardziej granularnego dostępu). Do kodowania treści DASH używane jest narzędzie takie jak FFmpeg lub pakietowe kodery. Przykład tworzenia strumienia DASH z pliku wejściowego:
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"
])
Wybór między DASH a HLS to jedna z kluczowych decyzji przy projektowaniu systemu strumieniowania wideo. Oba protokoły rozwiązują to samo zadanie (adaptacyjne dostarczanie wideo przez HTTP), ale mają zasadnicze różnice w architekturze, obsłudze kodeków i ekosystemie. Rozpatrzmy je według kluczowych parametrów.
| Parametr | DASH | HLS |
|---|---|---|
| Standard | Międzynarodowy (ISO/IEC 23009-1) | Zastrzeżony (RFC 8216, Apple) |
| Opis strumienia | XML (MPD) | Lista odtwarzania M3U8 |
| Kodeki | Dowolne (H.264, HEVC, AV1, VP9) | Ograniczone (H.264, HEVC, AV1 od 2023) |
| Format segmentów | fMP4 (główny), MPEG-2 TS | MPEG-2 TS, fMP4 |
| DRM | CENC (jednolity dla wszystkich DRM) | FairPlay, Widevine (oddzielnie) |
| Wsparcie iOS | Przez zewnętrzne odtwarzacze | Natywnie (AVPlayer, Safari) |
| Przeglądarki | Chrome, Firefox, Edge (przez MSE) | Safari (natywnie), pozostałe przez MSE |
Kluczowa zaleta DASH — niezależność od kodeków. Jeśli HLS początkowo ograniczał kodeki do tych obsługiwanych przez Apple (H.264, HEVC, a od niedawna AV1), to DASH może używać dowolnego kodeka obsługiwanego przez odtwarzacz: VP9/VP8 (krytyczne dla YouTube i Chrome), AV1 (dla wydajności), H.264/HEVC (dla kompatybilności). To czyni DASH preferowanym wyborem dla platform wieloplatformowych, gdzie wymagany jest jednolity strumień dla wszystkich urządzeń.
Wada DASH na iOS — brak natywnego wsparcia w Safari i AVPlayer. Deweloperzy aplikacji iOS muszą korzystać z zewnętrznych odtwarzaczy kompatybilnych z HLS lub bibliotek takich jak libdash z integracją przez VTDecoder. W praktyce oznacza to, że dla projektów zorientowanych na iOS HLS pozostaje standardem de facto, podczas gdy dla Androida i platform webowych DASH jest bardziej elastycznym i wydajnym rozwiązaniem.
Integracja DASH w aplikacjach mobilnych zależy od platformy. Na Androidzie DASH jest obsługiwany bezpośrednio przez ExoPlayer z modułem rozszerzenia. Na iOS wymagane jest użycie zewnętrznych bibliotek, takich jak libdash z integracją przez AVFoundation lub MPEGDASHPlayer. Rozpatrzmy praktyczną implementację dla obu platform.
ExoPlayer od Google zapewnia wbudowaną obsługę DASH przez moduł `exoplayer-dash`. Podłączenie strumienia DASH nie różni się od innych formatów — wystarczy przekazać URI pliku MPD do MediaItem. ExoPlayer automatycznie określa format treści i uruchamia odpowiedni renderer, obsługując wszystkie standardowe algorytmy 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) — jedna z kluczowych możliwości DASH, pozwalająca na używanie jednego strumienia multimedialnego z różnymi systemami DRM. Plik MPD zawiera elementy XML ContentProtection z identyfikatorami systemów DRM (Widevine, PlayReady, FairPlay). Klient wybiera odpowiedni system DRM na podstawie swojej platformy i żąda licencji przez serwer licencyjny.
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()
Aplikacje mobilne wymagają specjalnego dostrojenia DASH ze względu na ograniczenia przepustowości i zużycia energii. Główne zalecenia obejmują: ustawienie minimalnego bufora na 2-3 segmenty dla odporności na krótkotrwałe spadki prędkości, używanie segmentów o długości 2-4 sekund dla szybszej reakcji na zmiany sieci oraz wstępne ładowanie następnego segmentu przy przełączaniu jakości.
W celu oszczędzania transferu w sieciach mobilnych Bitmovin (2024) zaleca używanie Content Steering — mechanizmu podobnego do analogicznej funkcji HLS, umożliwiającego dynamiczne kierowanie klienta do optymalnego węzła CDN. DASH Content Steering jest opisany w specyfikacji ISO/IEC 23009-1:2022 i obsługiwany w dash.js 4.5+ oraz ExoPlayer 2.18+.
Często zadawane pytania
DASH — otwarty międzynarodowy standard MPEG, niezwiązany z dostawcą. W przeciwieństwie do HLS (zastrzeżony protokół Apple), DASH obsługuje dowolne kodeki, używa opisu strumienia w formacie XML (MPD) zamiast M3U8 i zapewnia jednolity system DRM przez CENC. HLS ma natywne wsparcie na iOS, DASH jest bardziej elastyczny dla rozwiązań wieloplatformowych.
Na Androidzie głównym odtwarzaczem dla DASH jest ExoPlayer od Google z modułem exoplayer-dash. Na iOS używane są zewnętrzne rozwiązania, takie jak libdash z integracją przez AVFoundation lub komercyjne odtwarzacze (THEOplayer, Bitmovin). W przeglądarkach internetowych DASH jest odtwarzany przez dash.js z użyciem MediaSource Extensions.
MPD (Media Presentation Description) — to plik XML, który opisuje strukturę strumienia DASH: czas trwania treści, dostępne przepływności, rozdzielczości, kodeki, formaty segmentów i ich lokalizację. MPD służy jako punkt wejścia dla odtwarzacza, zastępując listę odtwarzania głównego w HLS. Bez pliku MPD odtwarzanie treści DASH jest niemożliwe.
Tak, DASH obsługuje zarówno VOD, jak i transmisje na żywo. Do transmisji na żywo używany jest dynamiczny typ MPD z automatyczną aktualizacją. Serwer okresowo aktualizuje MPD, dodając nowe segmenty i usuwając nieaktualne. Low-Latency DASH (LL-DASH) z kodowaniem fragmentarycznym pozwala osiągnąć opóźnienie 3-8 sekund, porównywalne z LL-HLS.
DASH używa Common Encryption (CENC, ISO/IEC 23001-7), który pozwala zaszyfrować treści multimedialne raz i odszyfrować je dowolnym systemem DRM. MPD zawiera elementy XML ContentProtection z oznaczeniem obsługiwanych systemów DRM (Widevine, PlayReady, FairPlay). Odtwarzacz wybiera odpowiedni system DRM na podstawie platformy i żąda licencji przez podany adres URL.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również