Dynamic Adaptive Streaming over HTTP (DASH) är en internationell standard för adaptiv multimedieströmningsöverföring utvecklad av MPEG (Moving Picture Experts Group). DASH levererar video och ljud via HTTP med hjälp av en XML-strömbeschrivning i formatet Media Presentation Description (MPD) och delar upp innehållet i segment med olika bithastigheter. Enligt Bitmovin Video Developer Report (2025) använder 58% av videoutvecklarna DASH, vilket gör det till det näst populäraste protokollet efter HLS.
Huvudpunkter
MPEG-DASH (Dynamic Adaptive Streaming over HTTP) — är en internationell standard ISO/IEC 23009-1, publicerad 2012 som svar på fragmenteringen av proprietära lösningar för adaptiv strömning. Till skillnad från HLS (Apples proprietära protokoll) och Smooth Streaming (Microsoft), utvecklades DASH från början som en öppen, inte bunden till en specifik leverantör, standard, vilket säkerställde dess breda stöd i branschen.
Den främsta innovationen med DASH — separationen av strömbeschrivningen och mediainnehållet. Strömbeschrivningen lagras i XML-filen MPD (Media Presentation Description), som innehåller all information om tillgängliga varianter: bithastigheter, upplösningar, kodekar, undertexter, ljudspår. Mediainnehållet lagras som separata segment (vanligtvis fMP4), som kan laddas oberoende via HTTP. En sådan arkitektur gör serverinfrastrukturen maximalt enkel — vilken HTTP-server som helst kan distribuera DASH-innehåll.
Anpassningsförmågan hos DASH realiseras genom multiplexering av varianter av samma innehåll. Servern förbereder flera representationer — kopior av innehållet med olika komprimeringsparametrar. Klienten analyserar kanalens bandbredd och växlar dynamiskt mellan representationer och väljer det optimala förhållandet mellan kvalitet och stabilitet vid uppspelning. Enligt akademisk forskning (IEEE Access, 2024) uppvisar DASH med BOLA-algoritmen 22% färre bithastighetsväxlingar jämfört med HLS vid instabil anslutning.
MPEG började arbeta med DASH 2010 efter analys av befintliga lösningar: Apple HLS, Microsoft Smooth Streaming och Adobe HDS. Den första versionen av standarden (ISO/IEC 23009-1:2012) släpptes 2012. Den andra versionen (2014) lade till stöd för händelser, förbättrad reklaminsättning och serverkontrollerad anpassning. Den tredje versionen (2019) — stöd för HDR, 8K, taktil video och förbättrad integration med MMT (MPEG Media Transport) för 5G-nätverk.
2024 tillkännagav MPEG DASH Next Generation, som inkluderar stöd för neurala nätverkskodekar, molnrendering och optimering för scenarier med Extended Reality (XR). Den viktigaste innovationen — Neural Network-Based Video Coding (NNVC), som använder ML-modeller för avkodning på klientsidan, vilket kan minska bithastigheten med 30-50% samtidigt som kvaliteten bibehålls.
Processen för uppspelning av DASH-ström består av fyra på varandra följande steg: hämta MPD, tolka strömbeschrivningen, välja initial representation och dynamiskt växla mellan representationer. Varje steg har sina egna särdrag som påverkar kvaliteten på användarupplevelsen.
Spelaren laddar MPD-filen från en känd URL. MPD innehåller en XML-struktur med beskrivning av hela strömmen: innehållets längd, tidsskala, tillgängliga perioder (Period), anpassningsuppsättningar (AdaptationSet) och representationer (Representation) med specifika kodningsparametrar. Spelaren tolkar MPD och skapar en intern modell av tillgängliga mediaresurser.
Exempel på en grundläggande MPD-fil för VOD-innehåll med två upplösningar:
<?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>
Efter att ha valt den initiala representationen börjar spelaren ladda segment. Varje segment innehåller några sekunders innehåll (vanligtvis 2-10 sekunder). Spelaren upprätthåller en buffert för flera segment framåt, vilket säkerställer motståndskraft mot kortvariga hastighetsfall i nätverket. Algoritmen för val av representation (ABR) övervakar kontinuerligt segmentens laddningshastighet och fattar beslut om växling mellan tillgängliga bithastigheter.
Moderna ABR-algoritmer för DASH, som BOLA (Buffer Occupancy based Lyapunov Algorithm) och Pensieve (baserad på Reinforcement Learning), tar inte bara hänsyn till aktuell bandbredd, utan även buffertstorlek, innehållstyp (sport, nyheter, film) och till och med enhetens energiförbrukning. BOLA, som ingår i dash.js och ExoPlayer, minimerar antalet bithastighetsväxlingar samtidigt som en stabil buffert bibehålls, vilket har bekräftats av ACM-forskning (Spiteri et al., 2020).
Den hierarkiska strukturen för DASH-strömmen är organiserad på fyra nivåer: MPD → Period → AdaptationSet → Representation. Varje nivå lägger till en detaljnivå och möjliggör beskrivning av komplexa scenarier — från enkel VOD till live-sändningar med reklaminsättningar och flervinkelvideo.
MPD — rotelementet som beskriver hela mediapresentationen. MPD-attribut bestämmer strömtyp (static för VOD, dynamic för live), total längd, tidsskala, profil och information om DRM. MPD kan innehålla en eller flera Perioder, som var och en representerar ett oberoende tidsintervall av innehåll.
Period — tidssegmentet för presentationen. För VOD används en Period för hela innehållet. För live med reklaminsättningar kan Period ändras dynamiskt — spelaren laddar den uppdaterade MPD och upptäcker en ny Period som motsvarar reklamblocket. Varje Period innehåller en eller flera AdaptationSets.
AdaptationSet — en grupp utbytbara representationer av samma mediatyp: video, ljud, undertexter. Inom en AdaptationSet skiljer sig alla representationer endast i bithastighet och/eller upplösning, men kodar samma innehåll. Viktig egenskap: spelaren kan växla mellan representationer inom samma AdaptationSet vid segmentsgränsen utan avbrott i uppspelningen.
Representation — en specifik kodningsvariant med en bestämd bithastighet, upplösning och kodek. För varje Representation anges i MPD en URL-mall för laddning av segment. DASH använder ett flexibelt segmentadresseringssystem — via URL-mallar med ersättning av segmentnummer och tid ($Number$, $Time$), vilket gör att servern dynamiskt kan generera filnamn utan att behöva räkna upp varje segment i MPD.
Segment av DASH kan vara av två typer: typ Segment (innehåller endast mediadata) och typ Subsegment (en del av ett segment för mer granulär åtkomst). För kodning av DASH-innehåll används verktyg som FFmpeg eller paketkodare. Exempel på hur man skapar en DASH-ström från en indatafil:
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"
])
Valet mellan DASH och HLS är ett av de viktigaste besluten vid utformningen av ett videoströmningssystem. Båda protokollen löser samma uppgift (adaptiv videoleverans via HTTP), men har grundläggande skillnader i arkitektur, kodekstöd och ekosystem. Låt oss titta på dem enligt nyckelparametrar.
| Parameter | DASH | HLS |
|---|---|---|
| Standard | Internationell (ISO/IEC 23009-1) | Proprietär (RFC 8216, Apple) |
| Strömbeschrivning | XML (MPD) | M3U8-spellista |
| Kodekar | Vilka som helst (H.264, HEVC, AV1, VP9) | Begränsade (H.264, HEVC, AV1 från 2023) |
| Segmentformat | fMP4 (huvudsakligt), MPEG-2 TS | MPEG-2 TS, fMP4 |
| DRM | CENC (enhetligt för alla DRM) | FairPlay, Widevine (separat) |
| iOS-stöd | Via tredjepartsspelare | Inbyggt (AVPlayer, Safari) |
| Webbläsare | Chrome, Firefox, Edge (via MSE) | Safari (inbyggt), övriga via MSE |
Främsta fördelen med DASH — oberoende av kodekar. Medan HLS ursprungligen begränsade kodekar till de som stöds av Apple (H.264, HEVC och nyligen AV1), kan DASH använda vilken kodek som helst som stöds av spelaren: VP9/VP8 (kritiskt för YouTube och Chrome), AV1 (för effektivitet), H.264/HEVC (för kompatibilitet). Detta gör DASH till det föredragna valet för plattformsoberoende tjänster där en enhetlig ström krävs för alla enheter.
Nackdel med DASH på iOS — avsaknad av inbyggt stöd i Safari och AVPlayer. Utvecklare av iOS-applikationer måste använda tredjepartsspelare kompatibla med HLS eller bibliotek som libdash med integration via VTDecoder. I praktiken innebär detta att för iOS-orienterade projekt förblir HLS de facto-standard, medan för Android och webbplattformar är DASH en mer flexibel och kraftfull lösning.
Integration av DASH i mobila applikationer beror på plattformen. På Android stöds DASH direkt via ExoPlayer med en tilläggsmodul. På iOS krävs användning av tredjepartsbibliotek, som libdash med integration via AVFoundation eller MPEGDASHPlayer. Låt oss titta på den praktiska implementeringen för båda plattformarna.
ExoPlayer från Google ger inbyggt stöd för DASH via modulen `exoplayer-dash`. Att ansluta en DASH-ström skiljer sig inte från andra format — det räcker att skicka MPD-filens URI till MediaItem. ExoPlayer bestämmer automatiskt innehållets format och startar lämplig renderare, med stöd för alla standard ABR-algoritmer.
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) — en av DASH:s nyckelfunktioner, som möjliggör användning av en enda mediaström med olika DRM-system. MPD-filen innehåller XML-element ContentProtection med identifierare för DRM-system (Widevine, PlayReady, FairPlay). Klienten väljer lämpligt DRM-system baserat på sin plattform och begär licens via licensservern.
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()
Mobila applikationer kräver särskild justering av DASH på grund av begränsningar i bandbredd och energiförbrukning. De viktigaste rekommendationerna inkluderar: ställa in en minimibuffert på 2-3 segment för motståndskraft mot kortvariga hastighetsfall, använda segment med en längd på 2-4 sekunder för snabbare reaktion på nätverksförändringar och förladda nästa segment vid kvalitetsväxling.
För att spara trafik i mobila nätverk rekommenderar Bitmovin (2024) användning av Content Steering — en mekanism liknande den analoga funktionen i HLS, som möjliggör dynamisk dirigering av klienten till en optimal CDN-nod. DASH Content Steering beskrivs i specifikationen ISO/IEC 23009-1:2022 och stöds i dash.js 4.5+ och ExoPlayer 2.18+.
Vanliga frågor
DASH — en öppen internationell MPEG-standard, inte bunden till leverantör. Till skillnad från HLS (Apples proprietära protokoll) stöder DASH vilka kodekar som helst, använder XML-strömbeschrivning (MPD) istället för M3U8 och tillhandahåller ett enhetligt DRM-system via CENC. HLS har inbyggt stöd på iOS, DASH är mer flexibelt för plattformsoberoende lösningar.
På Android är den främsta spelaren för DASH ExoPlayer från Google med modulen exoplayer-dash. På iOS används tredjepartslösningar som libdash med integration via AVFoundation eller kommersiella spelare (THEOplayer, Bitmovin). I webbläsare spelas DASH upp via dash.js med hjälp av MediaSource Extensions.
MPD (Media Presentation Description) — är en XML-fil som beskriver strukturen för en DASH-ström: innehållets längd, tillgängliga bithastigheter, upplösningar, kodekar, segmentformat och deras placering. MPD fungerar som en ingångspunkt för spelaren och ersätter master-spellistan i HLS. Utan MPD-fil är uppspelning av DASH-innehåll omöjlig.
Ja, DASH stöder både VOD och live-sändningar. För live-sändningar används dynamic typ av MPD med automatisk uppdatering. Servern uppdaterar periodvis MPD, lägger till nya segment och tar bort föråldrade. Low-Latency DASH (LL-DASH) med chunked encoding möjliggör en fördröjning på 3-8 sekunder, jämförbar med LL-HLS.
DASH använder Common Encryption (CENC, ISO/IEC 23001-7), som gör det möjligt att kryptera mediainnehåll en gång och dekryptera det med vilket DRM-system som helst. MPD innehåller XML-element ContentProtection med angivelse av vilka DRM som stöds (Widevine, PlayReady, FairPlay). Spelaren väljer lämpligt DRM baserat på plattform och begär licens via den angivna URL:en.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också