HTTP Live Streaming (HLS) è un protocollo di streaming adattivo di dati multimediali sviluppato da Apple. HLS distribuisce video e audio attraverso connessioni HTTP suddividendo il contenuto in una sequenza di piccoli file segmento e gestendo la riproduzione tramite playlist di testo in formato M3U8. Secondo il Sandvine Internet Phenomena Report (2025), HLS gestisce oltre il 65% del traffico mondiale di streaming video adattivo. Il protocollo è supportato su tutte le piattaforme Apple ed è disponibile su Android, Windows e Smart TV tramite librerie di terze parti.
Punti chiave
HTTP Live Streaming (HLS) è un protocollo di streaming multimediale sviluppato da Apple nel 2009 e introdotto per la prima volta in iOS 3.0 e Safari. Nel 2017, il protocollo è stato proposto come standard Internet attraverso la RFC 8216, confermando il suo status di specifica aperta disponibile per l’implementazione su qualsiasi piattaforma.
L’idea principale di HLS consiste nel dividere un flusso multimediale continuo in segmenti brevi di 2–10 secondi. Ogni segmento è un file indipendente che può essere scaricato tramite una normale richiesta HTTP. La gestione del flusso avviene tramite playlist di testo in formato M3U8, che contengono riferimenti ai segmenti e metadati per la loro corretta riproduzione.
L’adattività è il vantaggio chiave di HLS. Il server prepara più versioni dello stesso contenuto con bitrate diversi, da 200 Kbps per connessioni deboli a oltre 20 Mbps per video 4K. Il cliente seleziona automaticamente il bitrate appropriato in base alla larghezza di banda corrente del canale. Secondo una ricerca Apple (WWDC 2024), LL-HLS riduce il tempo di commutazione tra bitrate a 500 millisecondi, garantendo cambi di qualità fluidi senza pause percepibili.
La prima versione di HLS (2009) supportava solo segmenti MPEG-2 TS con codec audio AAC e codec video H.264. iOS 8 (2014) ha aggiunto il supporto per segmenti fMP4 (fragmented MP4), consentendo di utilizzare HLS con codec più moderni, incluso HEVC (H.265). iOS 11 (2017) ha introdotto il supporto per HDR10 e Dolby Vision. iOS 13 (2019) ha introdotto Low-Latency HLS, riducendo la latenza dai tradizionali 6–30 secondi a 2–6 secondi.
Nel 2023, Apple ha ampliato HLS con il supporto per i codec AV1 e EVC (Essential Video Coding), e ha introdotto Content Steering — un meccanismo di reindirizzamento dinamico dei client tra server CDN per un bilanciamento del carico ottimale. Content Steering consente al server di modificare al volo gli URL dei segmenti, reindirizzando il client al nodo CDN più vicino o meno carico senza interrompere la riproduzione.
L’architettura HLS è composta da tre componenti principali: il lato server (server di origine + codificatore), la rete di distribuzione (CDN) e il lato client (lettore con supporto HLS). L’intero processo, dall’acquisizione video alla riproduzione sul dispositivo dell’utente, comprende diverse fasi sequenziali, ciascuna critica per la qualità dello streaming.
Il video sorgente viene prima codificato in più varianti con diversi bitrate e risoluzioni. I codificatori professionali, come FFmpeg o AWS Elemental MediaConvert, creano simultaneamente 4–12 varianti di flusso: da 240p (400 Kbps) a 4K (40 Mbps). Ogni variante viene suddivisa in segmenti di uguale durata, tipicamente 2–6 secondi per LL-HLS o 6–10 secondi per HLS tradizionale.
Per ogni variante viene creata una playlist di variante (variant playlist) contenente gli URL di tutti i segmenti e la loro durata. Inoltre, viene creata una playlist master (master playlist) che combina tutte le varianti e contiene informazioni su ciascuna: risoluzione, bitrate, codec e tracce audio. Il cliente carica prima la playlist master, poi seleziona la variante appropriata in base all’analisi della velocità di connessione.
I segmenti e le playlist vengono memorizzati nella cache su server CDN situati geograficamente vicini agli utenti. L’uso del protocollo HTTP standard per la distribuzione dà a HLS un vantaggio critico: qualsiasi CDN, bilanciatore di carico o server proxy che supporta HTTP funziona con HLS senza configurazione aggiuntiva. Questo distingue HLS dai protocolli in tempo reale come RTMP o WebRTC, che richiedono server specializzati.
import subprocess
subprocess.run([
"ffmpeg",
"-i", "input.mp4",
"-codec:v", "libx264",
"-codec:a", "aac",
"-hls_time", "6",
"-hls_list_size", "0",
"-var_stream_map", "v:0,a:0 v:1,a:1",
"-map", "v:0", "-b:v:0", "5000k",
"-map", "v:1", "-b:v:1", "1000k",
"-f", "hls",
"stream/output.m3u8"
])
Il lato client utilizza un algoritmo di selezione del bitrate adattivo (ABR). Il lettore HLS carica la playlist master, analizza le varianti disponibili e avvia la riproduzione al bitrate più adatto. Durante la riproduzione, il lettore monitora costantemente la velocità di download dei segmenti e il livello del buffer, decidendo se passare a un bitrate più alto o più basso. Gli algoritmi ABR moderni considerano non solo la velocità della rete, ma anche la dimensione del buffer, il tipo di contenuto e persino il consumo energetico del dispositivo.
Comprendere la struttura di un flusso HLS è necessario per configurare correttamente codifica, distribuzione e debug dei problemi di riproduzione. Ogni flusso HLS è composto da due livelli di playlist e numerosi segmenti multimediali organizzati in una gerarchia rigorosa.
La playlist master è il punto di ingresso per il lettore HLS. Il file con estensione .m3u8 contiene riferimenti a tutte le varianti del flusso e le loro caratteristiche. Il lettore carica prima questo file e, sulla base delle informazioni su bitrate e risoluzioni, prende la decisione iniziale su quale variante selezionare. La playlist master può anche contenere riferimenti a tracce audio alternative, sottotitoli e playlist I-Frame per la ricerca veloce.
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360
360p/video.m3u8
La playlist multimediale contiene l’elenco effettivo dei segmenti per una variante di flusso. Ogni segmento è specificato con la sua durata e URI. La playlist multimediale può essere statica (per VOD — un elenco completo di tutti i segmenti) o aggiornata dinamicamente (per trasmissioni live — i segmenti vecchi vengono rimossi, quelli nuovi vengono aggiunti).
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:6.000,
segment001.ts
#EXTINF:6.000,
segment002.ts
#EXT-X-ENDLIST
HLS supporta due formati principali di segmenti multimediali: MPEG-2 Transport Stream (.ts) e Fragmented MP4 (.m4s o .mp4). MPEG-2 TS è il formato originale di HLS, che offre la massima compatibilità. fMP4 è un formato più moderno che supporta HDR, HEVC e una compressione più efficiente. Apple raccomanda fMP4 per tutti i nuovi progetti a partire da iOS 10 e macOS Sierra.
Elementi aggiuntivi del flusso HLS includono playlist I-Frame per la ricerca veloce, metadati ID3 per sincronizzare sottotitoli e marcatori pubblicitari, e Session Data per trasmettere informazioni di visualizzazione ai server di analisi. Tutti questi elementi sono opzionali, ma il loro utilizzo migliora la qualità dell’esperienza utente.
HLS domina il mercato dello streaming video grazie a diversi vantaggi architetturali, ma ha anche limitazioni che devono essere considerate nella scelta di un protocollo per un progetto specifico. Confrontiamo HLS con protocolli alternativi di distribuzione video.
| Caratteristica | HLS | DASH | RTMP |
|---|---|---|---|
| Trasporto | HTTP (80/443) | HTTP (80/443) | TCP (1935) |
| Adattività | Sì (ABR) | Sì (ABR) | No |
| Bassa latenza | 2–6 s (LL-HLS) | 3–8 s (LL-DASH) | 0.5–2 s |
| Supporto HDR | Sì (iOS 11+) | Sì | Limitato |
| iOS nativo | Sì (Safari, AVPlayer) | Tramite lettori di terze parti | No |
| Semplicità CDN | Massima (HTTP) | Massima (HTTP) | Server specializzati |
Il vantaggio principale di HLS è il supporto nativo su tutti i dispositivi Apple (iPhone, iPad, Apple TV, Mac) tramite l’AVPlayer integrato. Questo rende HLS lo standard de facto per le applicazioni iOS/macOS. Inoltre, l’uso di HTTP standard per la distribuzione consente di memorizzare nella cache i contenuti su qualsiasi CDN e server proxy senza configurazione aggiuntiva, semplificando notevolmente l’infrastruttura di distribuzione.
Gli svantaggi di HLS includono una latenza più elevata rispetto a RTMP o WebRTC per le trasmissioni live. Anche con LL-HLS, la latenza minima è di 2–6 secondi, il che è inaccettabile per scenari interattivi in tempo reale. Inoltre, HLS genera più file sul server (ogni segmento è un file separato), il che può creare carico sul filesystem con un gran numero di flussi simultanei.
L’integrazione di HLS nelle applicazioni mobili differisce a seconda della piattaforma. Su iOS e macOS, HLS è supportato a livello di sistema operativo tramite AVFoundation e AVPlayer, fornendo decodifica accelerata hardware e consumo energetico minimo. Su Android, HLS non è supportato dal MediaPlayer integrato ma è disponibile tramite ExoPlayer — il lettore multimediale ufficiale di Google.
Sulla piattaforma Apple, la riproduzione HLS è estremamente semplice grazie al supporto integrato in AVPlayer. Basta creare un AVPlayer con l’URL della playlist master, e il sistema gestisce automaticamente la commutazione adattiva del bitrate, la selezione delle tracce audio e l’elaborazione dei sottotitoli. Lo sviluppatore ottiene inoltre il controllo completo sulla riproduzione tramite AVPlayerItem e AVAssetResourceLoader.
import AVFoundation
let url = URL(string: "https://example.com/stream.m3u8")!
let player = AVPlayer(url: url)
let controller = AVPlayerViewController()
controller.player = player
present(controller, animated: true) {
player.play()
}
Per Android viene utilizzato ExoPlayer, che supporta HLS tramite un modulo di estensione separato. ExoPlayer fornisce un controllo più preciso sul flusso HLS: è possibile gestire la selezione del bitrate, configurare il buffering e gestire gli errori di caricamento dei segmenti individualmente. LL-HLS richiede ExoPlayer versione 2.14.0 o superiore.
val player = ExoPlayer.Builder(this).build()
val uri = Uri.parse("https://example.com/stream.m3u8")
val mediaItem = MediaItem.fromUri(uri)
player.setMediaItem(mediaItem)
player.prepare()
player.play()
Le applicazioni mobili richiedono un approccio speciale alla configurazione di HLS a causa dell’instabilità delle reti cellulari e delle limitazioni del traffico. Le principali raccomandazioni includono: configurare il bitrate iniziale in base al tipo di rete (Wi-Fi o cellulare), utilizzare durate dei segmenti più brevi (2–4 secondi) per un adattamento più rapido, precaricare il buffer quando si passa al Wi-Fi e dare priorità alla traccia audio su segnali deboli.
Apple nella specifica HLS Authoring Specification for Apple Devices (2024) raccomanda di utilizzare una dimensione dei segmenti non superiore a 6 secondi per i dispositivi mobili e almeno 4 varianti di bitrate. Per risparmiare traffico sulle reti mobili, il server dovrebbe distribuire i segmenti con l’intestazione HTTP Cache-Control, consentendo di memorizzare nella cache i contenuti sui server proxy intermedi degli operatori di telecomunicazioni.
Domande frequenti
MP4 è un contenitore per memorizzare un intero file video che deve essere completamente scaricato prima dell’inizio della riproduzione. HLS suddivide il video in piccoli segmenti e consente di iniziare la visione 2–6 secondi dopo il caricamento del primo segmento, adattando automaticamente la qualità alla velocità Internet.
Sì, HLS non richiede software server Apple. Qualsiasi server HTTP (Nginx, Apache, CDN) può distribuire contenuti HLS. Per codificare il video in HLS si utilizza FFmpeg o codificatori professionali. L’unico requisito è la corretta configurazione del tipo MIME per i file .m3u8.
Sì, HLS è stato originariamente sviluppato per le trasmissioni live. Durante una trasmissione live, la playlist multimediale viene aggiornata dinamicamente: il server aggiunge nuovi segmenti e rimuove quelli vecchi. Low-Latency HLS (LL-HLS) riduce la latenza a 2–6 secondi, rendendo HLS adatto per trasmissioni sportive e telegiornali.
La playlist master combina tutte le varianti dello stesso contenuto con diversi bitrate e risoluzioni. Il lettore la carica per prima, analizza le caratteristiche di ogni variante (bitrate, risoluzione, codec) e seleziona quella ottimale per le condizioni di rete attuali. Senza una playlist master, la commutazione adattiva della qualità è impossibile.
HLS supporta la crittografia AES-128 dei segmenti e l’integrazione con sistemi DRM: FairPlay Streaming (Apple), Widevine (Google) e PlayReady (Microsoft). Le chiavi di crittografia vengono trasmesse su un canale sicuro separato. Per una protezione aggiuntiva, viene utilizzata l’autenticazione basata su token per l’accesso alle playlist.
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