Dynamic Adaptive Streaming over HTTP (DASH) è uno standard internazionale per lo streaming adattivo multimediale, sviluppato da MPEG (Moving Picture Experts Group). DASH fornisce video e audio tramite HTTP utilizzando una descrizione XML del flusso in formato Media Presentation Description (MPD) e suddivide il contenuto in segmenti con diversi bitrate. Secondo il Bitmovin Video Developer Report (2025), il 58% degli sviluppatori video utilizza DASH, rendendolo il secondo protocollo più popolare dopo HLS.
Punti chiave
MPEG-DASH (Dynamic Adaptive Streaming over HTTP) è uno standard internazionale ISO/IEC 23009-1, pubblicato nel 2012 come risposta alla frammentazione delle soluzioni proprietarie di streaming adattivo. A differenza di HLS (protocollo proprietario di Apple) e Smooth Streaming (Microsoft), DASH è stato sviluppato fin dall'inizio come uno standard aperto e indipendente dal fornitore, garantendo così il suo ampio supporto nell'industria.
L'innovazione principale di DASH è la separazione della descrizione del flusso e del contenuto multimediale. La descrizione del flusso è memorizzata in un file XML chiamato MPD (Media Presentation Description), che contiene tutte le informazioni sulle opzioni disponibili: bitrate, risoluzioni, codec, sottotitoli, tracce audio. Il contenuto multimediale è memorizzato in segmenti separati (solitamente fMP4), che possono essere caricati indipendentemente tramite HTTP. Questa architettura consente all'infrastruttura del server di essere il più semplice possibile — qualsiasi server HTTP può servire contenuti DASH.
L'adattabilità in DASH è implementata attraverso il multiplexing delle varianti di contenuto. Il server prepara diverse Representations — copie del contenuto con diversi parametri di compressione. Il client analizza la larghezza di banda del canale e passa dinamicamente tra le rappresentazioni, scegliendo l'equilibrio ottimale tra qualità e stabilità di riproduzione. Secondo uno studio accademico (IEEE Access, 2024), DASH con l'algoritmo BOLA mostra il 22% in meno di cambi di bitrate rispetto a HLS in connessioni instabili.
MPEG ha iniziato a lavorare su DASH nel 2010 dopo aver analizzato le soluzioni esistenti: Apple HLS, Microsoft Smooth Streaming e Adobe HDS. La prima versione dello standard (ISO/IEC 23009-1:2012) è stata rilasciata nel 2012. La seconda versione (2014) ha aggiunto il supporto per eventi, inserimento pubblicitario migliorato e adattamento controllato dal server. La terza versione (2019) ha aggiunto il supporto per HDR, 8K, video aptico e una migliore integrazione con MMT (MPEG Media Transport) per reti 5G.
Nel 2024, MPEG ha annunciato DASH Next Generation, che include il supporto per codec a rete neurale, rendering cloud e ottimizzazione per scenari di Realtà Estesa (XR). Un'innovazione chiave è la codifica video basata su reti neurali (NNVC), che utilizza modelli ML per la decodifica lato client, riducendo potenzialmente il bitrate del 30-50% mantenendo la qualità.
Il processo di riproduzione di un flusso DASH consiste in quattro fasi sequenziali: recupero del MPD, analisi della descrizione del flusso, selezione della rappresentazione iniziale e commutazione dinamica tra rappresentazioni. Ogni fase ha le sue specificità che influenzano la qualità dell'esperienza utente.
Il lettore carica il file MPD da un URL noto. Il MPD contiene una struttura XML che descrive l'intero flusso: durata del contenuto, linea temporale, periodi disponibili (Period), set di adattamento (AdaptationSet) e rappresentazioni (Representation) con parametri di codifica specifici. Il lettore analizza il MPD e crea un modello interno delle risorse multimediali disponibili.
Esempio di un file MPD di base per contenuti VOD con due risoluzioni:
<?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>
Dopo aver selezionato la rappresentazione iniziale, il lettore inizia a caricare i segmenti. Ogni segmento contiene diversi secondi di contenuto (solitamente 2-10 secondi). Il lettore mantiene un buffer di diversi segmenti in anticipo, garantendo resistenza a cali di breve durata della velocità di rete. L'algoritmo ABR (Adaptive Bitrate) monitora costantemente la velocità di download dei segmenti e decide di passare da un bitrate all'altro tra quelli disponibili.
Gli algoritmi ABR moderni per DASH, come BOLA (Buffer Occupancy based Lyapunov Algorithm) e Pensieve (basato su Reinforcement Learning), considerano non solo la larghezza di banda attuale ma anche la dimensione del buffer, il tipo di contenuto (sport, notizie, film) e persino il consumo energetico del dispositivo. BOLA, che fa parte di dash.js e ExoPlayer, minimizza il numero di cambi di bitrate mantenendo un buffer stabile, come confermato dalla ricerca ACM (Spiteri et al., 2020).
La struttura gerarchica di un flusso DASH è organizzata in quattro livelli: MPD → Period → AdaptationSet → Representation. Ogni livello aggiunge un livello di dettaglio, consentendo di descrivere scenari complessi — dal semplice VOD alle trasmissioni live con inserimenti pubblicitari e video multi-angolo.
MPD è l'elemento radice che descrive l'intera presentazione multimediale. Gli attributi MPD definiscono il tipo di flusso (static per VOD, dynamic per live), la durata totale, la linea temporale, il profilo e le informazioni DRM. Il MPD può contenere uno o più Period, ciascuno rappresentante un segmento temporale indipendente del contenuto.
Period è un segmento temporale della presentazione. Per VOD, viene utilizzato un singolo Period per l'intero contenuto. Per il live con pause pubblicitarie, il Period può cambiare dinamicamente — il lettore carica il MPD aggiornato e rileva un nuovo Period corrispondente al blocco pubblicitario. Ogni Period contiene uno o più AdaptationSet.
AdaptationSet è un gruppo di rappresentazioni intercambiabili di un tipo di media: video, audio, sottotitoli. All'interno di un AdaptationSet, tutte le rappresentazioni differiscono solo per bitrate e/o risoluzione ma codificano lo stesso contenuto. Una proprietà importante: il lettore può passare da una rappresentazione all'altra all'interno dello stesso AdaptationSet ai confini dei segmenti senza interruzione della riproduzione.
Representation è una variante di codifica specifica con un bitrate, risoluzione e codec definiti. Per ogni Representation, il MPD specifica un modello URL per caricare i segmenti. DASH utilizza un sistema flessibile di indirizzamento dei segmenti — attraverso modelli URL con sostituzione del numero di segmento e del tempo ($Number$, $Time$), consentendo al server di generare dinamicamente nomi di file senza dover elencare ogni segmento nel MPD.
I segmenti in DASH possono essere di due tipi: tipo Segment (contengono solo dati multimediali) e tipo Subsegment (parte di un segmento per un accesso più granulare). Per codificare contenuti DASH, vengono utilizzati strumenti come FFmpeg o codificatori batch. Esempio di creazione di un flusso DASH da un file di input:
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"
])
La scelta tra DASH e HLS è una delle decisioni chiave nella progettazione di un sistema di streaming video. Entrambi i protocolli risolvono lo stesso problema (consegna adattiva di video su HTTP) ma hanno differenze fondamentali in architettura, supporto dei codec ed ecosistema. Esaminiamoli per parametri chiave.
| Parametro | DASH | HLS |
|---|---|---|
| Standard | Internazionale (ISO/IEC 23009-1) | Proprietario (RFC 8216, Apple) |
| Descrizione del flusso | XML (MPD) | Playlist M3U8 |
| Codec | Qualsiasi (H.264, HEVC, AV1, VP9) | Limitato (H.264, HEVC, AV1 dal 2023) |
| Formato segmenti | fMP4 (principale), MPEG-2 TS | MPEG-2 TS, fMP4 |
| DRM | CENC (unificato per tutti i DRM) | FairPlay, Widevine (separati) |
| Supporto iOS | Tramite lettori di terze parti | Nativo (AVPlayer, Safari) |
| Browser | Chrome, Firefox, Edge (tramite MSE) | Safari (nativo), altri tramite MSE |
Vantaggio chiave di DASH — indipendenza dai codec. Mentre HLS originariamente limitava i codec a quelli supportati da Apple (H.264, HEVC e recentemente AV1), DASH può utilizzare qualsiasi codec supportato dal lettore: VP9/VP8 (critico per YouTube e Chrome), AV1 (per efficienza), H.264/HEVC (per compatibilità). Questo rende DASH la scelta preferita per servizi multipiattaforma che richiedono un flusso unificato per tutti i dispositivi.
Svantaggio di DASH su iOS — mancanza di supporto nativo in Safari e AVPlayer. Gli sviluppatori iOS devono utilizzare lettori compatibili HLS di terze parti o librerie come libdash con integrazione tramite VTDecoder. In pratica, ciò significa che per i progetti incentrati su iOS, HLS rimane lo standard de facto, mentre per Android e piattaforme web, DASH è una soluzione più flessibile e potente.
L'integrazione di DASH nelle applicazioni mobili dipende dalla piattaforma. Su Android, DASH è supportato direttamente tramite ExoPlayer con il modulo di estensione. Su iOS, sono necessarie librerie di terze parti come libdash con integrazione tramite AVFoundation o MPEGDASHPlayer. Vediamo l'implementazione pratica per entrambe le piattaforme.
ExoPlayer di Google fornisce supporto integrato per DASH attraverso il modulo `exoplayer-dash`. Connettere un flusso DASH non è diverso da altri formati — basta passare l'URI del file MPD in un MediaItem. ExoPlayer rileva automaticamente il formato del contenuto e avvia il renderer appropriato, supportando tutti gli algoritmi ABR standard.
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) è una delle caratteristiche chiave di DASH, che consente di utilizzare un singolo flusso multimediale con diversi sistemi DRM. Il file MPD contiene elementi XML ContentProtection con identificatori di sistemi DRM (Widevine, PlayReady, FairPlay). Il client seleziona il sistema DRM appropriato in base alla propria piattaforma e richiede una licenza al server di licenze.
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()
Le applicazioni mobili richiedono una configurazione speciale di DASH a causa delle limitazioni di larghezza di banda e consumo energetico. Le raccomandazioni principali includono: impostare un buffer minimo di 2-3 segmenti per resistere a cali di velocità di breve durata, utilizzare segmenti di 2-4 secondi per una risposta più rapida ai cambiamenti di rete e precaricare il segmento successivo durante il cambio di qualità.
Per risparmiare traffico sulle reti mobili, Bitmovin (2024) raccomanda di utilizzare Content Steering — un meccanismo simile alla funzione analoga di HLS, che consente di indirizzare dinamicamente il client al nodo CDN ottimale. DASH Content Steering è descritto nella specifica ISO/IEC 23009-1:2022 ed è supportato in dash.js 4.5+ e ExoPlayer 2.18+.
Domande frequenti
DASH è uno standard internazionale aperto MPEG, non legato a nessun fornitore. A differenza di HLS (protocollo proprietario di Apple), DASH supporta qualsiasi codec, utilizza la descrizione del flusso XML (MPD) invece di M3U8 e fornisce un sistema DRM unificato tramite CENC. HLS ha supporto nativo su iOS, mentre DASH è più flessibile per soluzioni multipiattaforma.
Su Android, il lettore principale per DASH è ExoPlayer di Google con il modulo exoplayer-dash. Su iOS, vengono utilizzate soluzioni di terze parti come libdash con integrazione tramite AVFoundation o lettori commerciali (THEOplayer, Bitmovin). Nei browser web, DASH viene riprodotto tramite dash.js utilizzando MediaSource Extensions.
MPD (Media Presentation Description) è un file XML che descrive la struttura del flusso DASH: durata del contenuto, bitrate disponibili, risoluzioni, codec, formati dei segmenti e loro posizione. MPD funge da punto di ingresso per il lettore, sostituendo la playlist master in HLS. Senza un file MPD, la riproduzione di contenuti DASH è impossibile.
Sì, DASH supporta sia VOD che trasmissioni live. Per il live, viene utilizzato il tipo MPD dynamic con aggiornamento automatico. Il server aggiorna periodicamente il MPD, aggiungendo nuovi segmenti e rimuovendo quelli obsoleti. Low-Latency DASH (LL-DASH) con codifica chunked consente di raggiungere una latenza di 3-8 secondi, paragonabile a LL-HLS.
DASH utilizza Common Encryption (CENC, ISO/IEC 23001-7), che consente di crittografare il contenuto multimediale una volta e decrittografarlo con qualsiasi sistema DRM. Il MPD contiene elementi XML ContentProtection che indicano i DRM supportati (Widevine, PlayReady, FairPlay). Il lettore seleziona il DRM appropriato in base alla piattaforma e richiede una licenza tramite l'URL specificato.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche