DASH — co to jest, protokół i zasada działania dynamicznego strumieniowania

Autor: IT Sectr Opublikowano: 2026-05-23 Czas czytania: 9 min

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

  • DASH — to otwarty międzynarodowy standard MPEG do adaptacyjnego przesyłania strumieniowego przez HTTP.
  • Plik MPD (Media Presentation Description) zarządza strumieniem poprzez strukturę XML z opisem okresów i zestawów adaptacji.
  • Kodeki nie są ograniczone specyfikacją — DASH obsługuje H.264, HEVC, AV1, VP9, AAC i inne.
  • DRM jest realizowany przez Common Encryption (CENC), obsługujący Widevine, PlayReady i FairPlay w jednym strumieniu.
  • Wieloplatformowość DASH jest zapewniana przez ExoPlayer (Android), dash.js (przeglądarki) i libdash.

Co to jest DASH?

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.

Historia i standaryzacja DASH

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.

Jak działa DASH?

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.

Pobieranie i parsowanie MPD

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
<?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>

Ładowanie segmentów i adaptacja

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).

Struktura DASH: MPD, Period, Adaptation Set

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 (Media Presentation Description)

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, AdaptationSet i Representation

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.

Segmentacja i pakowanie

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:

python
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 vs HLS: porównanie protokołów

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.

ParametrDASHHLS
StandardMiędzynarodowy (ISO/IEC 23009-1)Zastrzeżony (RFC 8216, Apple)
Opis strumieniaXML (MPD)Lista odtwarzania M3U8
KodekiDowolne (H.264, HEVC, AV1, VP9)Ograniczone (H.264, HEVC, AV1 od 2023)
Format segmentówfMP4 (główny), MPEG-2 TSMPEG-2 TS, fMP4
DRMCENC (jednolity dla wszystkich DRM)FairPlay, Widevine (oddzielnie)
Wsparcie iOSPrzez zewnętrzne odtwarzaczeNatywnie (AVPlayer, Safari)
PrzeglądarkiChrome, 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.

Zastosowanie DASH w rozwoju aplikacji mobilnych

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.

DASH na Androidzie przez ExoPlayer

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.

kotlin
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

DASH z DRM na obu platformach

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.

kotlin
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()

Optymalizacja DASH dla urządzeń mobilnych

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

Czym DASH różni się od HLS?

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.

Które odtwarzacze obsługują DASH na urządzeniach mobilnych?

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.

Czym jest MPD w kontekście DASH?

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.

Czy DASH obsługuje transmisje na żywo?

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.

Jak działa DRM w DASH?

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

  • MPEG-DASH — otwarty międzynarodowy standard adaptacyjnego strumieniowania HTTP z opisem strumienia w formacie XML MPD.
  • Niezależność od kodeków — DASH obsługuje H.264, HEVC, AV1, VP9 i wszelkie inne kodeki dostępne dla odtwarzacza.
  • CENC zapewnia jednolite szyfrowanie treści dla wszystkich systemów DRM, upraszczając licencjonowanie.
  • Algorytmy ABR (BOLA, Pensieve) minimalizują przełączania przepływności i zapewniają stabilne odtwarzanie.
  • Android — DASH jest obsługiwany natywnie w ExoPlayer; iOS wymaga zewnętrznych bibliotek.
  • LL-DASH skraca opóźnienie transmisji na żywo do 3-8 sekund.
  • Zaleca się używanie DASH do projektów wieloplatformowych, gdzie ważna jest elastyczność kodeków i DRM.

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.

Omów projekt

Przeczytaj również