HTTP Live Streaming (HLS) — är ett protokoll för adaptiv strömning av mediadata utvecklat av Apple. HLS levererar video och ljud via HTTP-anslutningar, delar upp innehållet i en sekvens av små filsegment och hanterar uppspelning via textbaserade spellistor i formatet M3U8. Enligt Sandvine Internet Phenomena Report (2025) hanterar HLS över 65 % av den globala trafiken för adaptiv videoströmning. Protokollet stöds på alla Apple-plattformar och via tredjepartsbibliotek finns det tillgängligt på Android, Windows och Smart TV.
Huvudpunkter
HTTP Live Streaming (HLS) — är ett protokoll för mediaströmning utvecklat av Apple 2009 och först introducerat i iOS 3.0 och Safari. 2017 föreslogs protokollet som en internetstandard via RFC 8216, vilket bekräftade dess status som en öppen specifikation tillgänglig för implementering på alla plattformar.
Grundidén med HLS är att dela upp den kontinuerliga mediaströmmen i korta segment på 2-10 sekunder. Varje segment är en självständig fil som kan laddas ner via en vanlig HTTP-förfrågan. Hanteringen av strömmen sker via textbaserade spellistor i M3U8-format, som innehåller länkar till segmenten och metadata för korrekt uppspelning.
Adaptivitet — är den viktigaste fördelen med HLS. Servern förbereder flera versioner av samma innehåll med olika bithastigheter — från 200 Kbps för svaga anslutningar till 20+ Mbps för 4K-video. Klienten väljer automatiskt lämplig bithastighet baserat på kanalens aktuella bandbredd. Enligt Apples forskning (WWDC 2024) minskar LL-HLS växlingstiden mellan bithastigheter till 500 millisekunder, vilket säkerställer smidig kvalitetsförändring utan märkbara pauser.
Den första versionen av HLS (2009) stödde endast MPEG-2 TS-segment med AAC-ljudcodec och H.264-videocodec. I iOS 8 (2014) lades stöd för fMP4 (fragmented MP4)-segment till, vilket möjliggjorde användning av HLS med modernare codecs, inklusive HEVC (H.265). iOS 11 (2017) introducerade stöd för HDR10 och Dolby Vision. iOS 13 (2019) introducerade Low-Latency HLS, vilket minskade latensen från traditionella 6-30 sekunder till 2-6 sekunder.
2023 utökade Apple HLS med stöd för codecs AV1 och EVC (Essential Video Coding), samt implementerade Content Steering — en mekanism för dynamisk omdirigering av klienter mellan CDN-servrar för optimal belastning. Content Steering tillåter servern att ändra segmentens URL:er i farten och omdirigera klienten till närmaste eller minst belastade CDN-nod utan att avbryta uppspelningen.
Arkitekturen för HLS består av tre huvudkomponenter: serverdel (originserver + kodare), distributionsnätverk (CDN) och klientdel (spelare med HLS-stöd). Hela processen — från videoinspelning till uppspelning på användarens enhet — omfattar flera på varandra följande steg, där varje steg är avgörande för streamingkvaliteten.
Källvideon kodas först i flera varianter med olika bithastigheter och upplösningar. Professionella kodare som FFmpeg eller AWS Elemental MediaConvert skapar samtidigt 4-12 strömvarianter: från 240p (400 Kbps) till 4K (40 Mbps). Varje variant delas upp i segment av samma längd, vanligtvis 2-6 sekunder för LL-HLS eller 6-10 sekunder för traditionell HLS.
För varje variant skapas en media spellista (variant playlist) som innehåller URL:er för alla segment och deras varaktighet. Dessutom skapas en master-spellista (master playlist) som kombinerar alla varianter och innehåller information om varje: upplösning, bithastighet, codec och ljudspår. Klienten laddar först ner master-spellistan och väljer sedan lämplig variant baserat på analys av anslutningshastigheten.
Segment och spellistor cachas på CDN-servrar som är geografiskt nära användarna. Användningen av standard-HTTP-protokollet för leverans ger HLS en kritisk fördel: alla CDN, lastbalanserare eller proxyservrar som stöder HTTP fungerar med HLS utan extra konfiguration. Detta skiljer HLS från realtidsprotokoll som RTMP eller WebRTC som kräver specialiserade servrar.
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"
])
Klient sidan använder algoritm för bithastighetsval (ABR — Adaptive Bitrate). HLS-spelaren laddar ner master-spellistan, analyserar tillgängliga varianter och startar uppspelning med den mest lämpliga bithastigheten. Under uppspelning övervakar spelaren kontinuerligt nedladdningshastigheten för segment och buffertfyllnad och fattar beslut om att växla till högre eller lägre bithastighet. Moderna ABR-algoritmer tar inte bara hänsyn till nätverkshastighet, utan också buffertstorlek, innehållstyp och till och med enhetens energiförbrukning.
Att förstå strukturen för en HLS-ström är nödvändigt för korrekt konfiguration av kodning, distribution och felsökning av uppspelningsproblem. Varje HLS-ström består av två nivåer av spellistor och många mediaSegment, organiserade i en strikt hierarki.
Master playlist — är ingångspunkten för HLS-spelaren. Filen med tillägget .m3u8 innehåller länkar till alla strömvarianter (variant streams) och deras egenskaper. Spelaren laddar ner denna fil först och baserat på information om bithastigheter och upplösningar fattar ett första beslut om val av variant. Master-spellistan kan också innehålla länkar till alternativa ljudspår, undertexter och I-Frame-spellistor för snabb spolning.
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360
360p/video.m3u8
Media playlist innehåller direkt listan över segment för en strömvariant. Varje segment anges med varaktighet och URI. Media spellistan kan vara statisk (för VOD — fullständig lista över alla segment) eller dynamiskt uppdaterad (för livesändningar — gamla segment tas bort, nya läggs till).
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:6.000,
segment001.ts
#EXTINF:6.000,
segment002.ts
#EXT-X-ENDLIST
HLS stöder två huvudsakliga mediaSegmentformat: MPEG-2 Transport Stream (.ts) och Fragmented MP4 (.m4s eller .mp4). MPEG-2 TS — det ursprungliga HLS-formatet som ger maximal kompatibilitet. fMP4 — ett modernare format som stöder HDR, HEVC och effektivare komprimering. Apple rekommenderar fMP4 för alla nya projekt från och med iOS 10 och macOS Sierra.
Ytterligare element i en HLS-ström inkluderar I-Frame-spellistor för snabb spolning, ID3-metadata för synkronisering av undertexter och reklammarkörer, samt Session Data för överföring av visningsinformation till analysservern. Alla dessa element är valfria, men deras användning förbättrar kvaliteten på användarupplevelsen.
HLS dominerar marknaden för videoströmning tack vare en rad arkitektoniska fördelar, men har också begränsningar som måste beaktas vid val av protokoll för ett specifikt projekt. Låt oss jämföra HLS med alternativa protokoll för videoleverans.
| Egenskap | HLS | DASH | RTMP |
|---|---|---|---|
| Transport | HTTP (80/443) | HTTP (80/443) | TCP (1935) |
| Adaptivitet | Ja (ABR) | Ja (ABR) | Nej |
| Låg latens | 2-6 sek (LL-HLS) | 3-8 sek (LL-DASH) | 0.5-2 sek |
| HDR-stöd | Ja (iOS 11+) | Ja | Begränsat |
| Native iOS | Ja (Safari, AVPlayer) | Via tredjepartsspelare | Nej |
| CDN-enkelhet | Maximal (HTTP) | Maximal (HTTP) | Specialiserade servrar |
Den största fördelen med HLS — inbyggt stöd på alla Apple-enheter (iPhone, iPad, Apple TV, Mac) via den inbyggda AVPlayer. Detta gör HLS till de facto-standard för iOS/macOS-applikationer. Dessutom möjliggör användningen av standard-HTTP för leverans cachning av innehåll på alla CDN och proxyservrar utan extra konfiguration, vilket avsevärt förenklar leveransinfrastrukturen.
Nackdelar med HLS inkluderar högre latens jämfört med RTMP eller WebRTC för livesändningar. Även med LL-HLS är den minsta latensen 2-6 sekunder, vilket är oacceptabelt för interaktiva realtidsscenarier. HLS genererar också fler filer på servern (varje segment är en separat fil), vilket kan belasta filsystemet vid ett stort antal samtidiga sändningar.
Integration av HLS i mobilappar varierar beroende på plattform. På iOS och macOS stöds HLS på operativsystemsnivå via AVFoundation och AVPlayer, vilket ger hårdvaruacceleration av avkodning och minimal energiförbrukning. På Android stöds inte HLS av den inbyggda MediaPlayer, men finns tillgängligt via ExoPlayer — den officiella mediaspelaren från Google.
På Apple-plattformen är HLS-uppspelning extremt enkel tack vare inbyggt stöd i AVPlayer. Det räcker att skapa en AVPlayer med URL:en till master-spellistan, och systemet hanterar automatiskt adaptiv bithastighetsväxling, val av ljudspår och bearbetning av undertexter. Utvecklaren har samtidigt full kontroll över uppspelningen via AVPlayerItem och 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()
}
För Android används ExoPlayer, som stöder HLS via en separat expansionsmodul. ExoPlayer ger finare kontroll över HLS-strömmen: bithastighetsval kan hanteras, buffring kan konfigureras och segmentladdningsfel kan hanteras individuellt. För LL-HLS krävs ExoPlayer version 2.14.0 och högre.
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()
Mobilappar kräver ett speciellt tillvägagångssätt för HLS-konfiguration på grund av instabiliteten i cellulära nätverk och trafikbegränsningar. De viktigaste rekommendationerna inkluderar: inställning av initial bithastighet baserat på nätverkstyp (Wi-Fi eller mobil), användning av kortare segmentlängd (2-4 sekunder) för snabbare anpassning, förladdning av bufferten vid byte till Wi-Fi och prioritering av ljudspåret vid svag signal.
Apple rekommenderar i dokumentationen HLS Authoring Specification for Apple Devices (2024) att använda segmentstorlek på högst 6 sekunder för mobila enheter och minst 4 bithastighetsvarianter. För att spara trafik i mobila nätverk bör servern leverera segment med HTTP-huvudet Cache-Control, vilket möjliggör cachning av innehåll på mellanliggande proxyservrar hos telekomoperatörer.
Vanliga frågor
MP4 — är en behållare för lagring av hela videofilen som måste laddas ner helt innan uppspelningen börjar. HLS delar upp videon i små segment och gör det möjligt att börja titta 2-6 sekunder efter nedladdning av det första segmentet, med automatisk anpassning av kvaliteten till internethastigheten.
Ja, HLS kräver ingen Apple-serverprogramvara. Vilken HTTP-server som helst (Nginx, Apache, CDN) kan distribuera HLS-innehåll. För kodning av video till HLS används FFmpeg eller professionella kodare. Det enda kravet är korrekt MIME-typkonfiguration för .m3u8-filer.
Ja, HLS designades ursprungligen för livesändningar. Vid livesändningar uppdateras media spellistan dynamiskt: servern lägger till nya segment och tar bort gamla. Low-Latency HLS (LL-HLS) minskar latensen till 2-6 sekunder, vilket gör HLS lämpligt för sport- och nyhetssändningar.
Master playlist kombinerar alla varianter av samma innehåll med olika bithastigheter och upplösningar. Spelaren laddar ner den först, analyserar egenskaperna för varje variant (bithastighet, upplösning, codec) och väljer den optimala för aktuella nätverksförhållanden. Utan master-spellistan är adaptiv kvalitetsväxling omöjlig.
HLS stöder AES-128-kryptering av segment och integration med DRM-system: FairPlay Streaming (Apple), Widevine (Google) och PlayReady (Microsoft). Krypteringsnycklar överförs via en separat skyddad kanal. För extra skydd används tokenautentisering för åtkomst till spellistor.
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å