HTTP Live Streaming (HLS), Apple tarafından geliştirilen uyarlamalı bir medya verisi akış protokolüdür. HLS, içeriği küçük segment dosyaları dizisine bölerek ve M3U8 formatındaki metin çalma listeleri aracılığıyla oynatmayı yöneterek HTTP bağlantıları üzerinden video ve ses iletir. Sandvine Internet Phenomena Report (2025)’e göre HLS, dünya çapındaki uyarlamalı video akış trafiğinin %65’inden fazlasını işler. Protokol tüm Apple platformlarında desteklenir ve üçüncü taraf kütüphaneler aracılığıyla Android, Windows ve Smart TV’de kullanılabilir.
Önemli Noktalar
HTTP Live Streaming (HLS), Apple tarafından 2009’da geliştirilen ve ilk olarak iOS 3.0 ve Safari’de tanıtılan bir medya akış protokolüdür. 2017’de protokol, RFC 8216 aracılığıyla bir internet standardı olarak önerilmiş ve herhangi bir platformda uygulanabilir açık bir özellik olarak statüsünü onaylamıştır.
HLS’nin temel fikri, sürekli bir medya akışını 2–10 saniyelik kısa segmentlere bölmektir. Her segment, normal bir HTTP isteğiyle indirilebilen bağımsız bir dosyadır. Akış yönetimi, segmentlere referanslar ve doğru oynatma için meta veriler içeren M3U8 formatındaki metin çalma listeleri aracılığıyla yapılır.
Uyarlanabilirlik, HLS’nin temel avantajıdır. Sunucu, zayıf bağlantılar için 200 Kbps’den 4K video için 20+ Mbps’ye kadar farklı bit hızlarında aynı içeriğin birden çok sürümünü hazırlar. İstemci, mevcut kanal bant genişliğine göre uygun bit hızını otomatik olarak seçer. Apple araştırmasına (WWDC 2024) göre LL-HLS, bit hızları arasında geçiş süresini 500 milisaniyeye düşürerek fark edilir duraklamalar olmadan yumuşak kalite değişimini garanti eder.
İlk sürüm HLS (2009) yalnızca AAC ses codec’i ve H.264 video codec’i ile MPEG-2 TS segmentlerini destekliyordu. iOS 8 (2014), fMP4 (fragmented MP4) segmentleri için destek ekleyerek HLS’nin HEVC (H.265) dahil daha modern codec’lerle kullanılmasına olanak sağladı. iOS 11 (2017), HDR10 ve Dolby Vision desteğini getirdi. iOS 13 (2019), Low-Latency HLS’yi tanıtarak gecikmeyi geleneksel 6–30 saniyeden 2–6 saniyeye düşürdü.
2023’te Apple, HLS’yi AV1 ve EVC (Essential Video Coding) codec’leri için destekle genişletti ve Content Steering’i (optimum yük dengesi için istemcileri CDN sunucuları arasında dinamik olarak yönlendiren bir mekanizma) tanıttı. Content Steering, sunucunun oynatmayı kesintiye uğratmadan istemciyi en yakın veya en az yüklü CDN düğümüne yönlendirirken segment URL’lerini anında değiştirmesine olanak tanır.
HLS mimarisi üç ana bileşenden oluşur: sunucu tarafı (kaynak sunucu + kodlayıcı), dağıtım ağı (CDN) ve istemci tarafı (HLS destekli oynatıcı). Video yakalamadan kullanıcının cihazında oynatmaya kadar olan tüm süreç, her biri akış kalitesi için kritik olan birkaç ardışık aşamayı içerir.
Kaynak video önce farklı bit hızları ve çözünürlüklerde birden çok çeşitte kodlanır. FFmpeg veya AWS Elemental MediaConvert gibi profesyonel kodlayıcılar, 240p’den (400 Kbps) 4K’ya (40 Mbps) kadar aynı anda 4–12 akış çeşidi oluşturur. Her çeşit, genellikle LL-HLS için 2–6 saniye veya geleneksel HLS için 6–10 saniye olmak üzere eşit süreli segmentlere bölünür.
Her çeşit için, tüm segmentlerin URL’lerini ve sürelerini içeren bir çeşit çalma listesi (variant playlist) oluşturulur. Ek olarak, tüm çeşitleri birleştiren ve her biri hakkında bilgi (çözünürlük, bit hızı, codec ve ses parçaları) içeren bir ana çalma listesi (master playlist) oluşturulur. İstemci önce ana çalma listesini yükler, ardından bağlantı hızı analizine göre uygun çeşidi seçer.
Segmentler ve çalma listeleri, kullanıcılara coğrafi olarak yakın konumdaki CDN sunucularında önbelleğe alınır. Dağıtım için standart HTTP protokolünün kullanılması, HLS’ye kritik bir avantaj sağlar: HTTP’yi destekleyen herhangi bir CDN, yük dengeleyici veya proxy sunucusu, ek yapılandırma olmadan HLS ile çalışır. Bu, HLS’yi özel sunucular gerektiren RTMP veya WebRTC gibi gerçek zamanlı protokollerden ayırır.
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"
])
İstemci tarafı, uyarlamalı bit hızı algoritması (ABR) kullanır. HLS oynatıcısı ana çalma listesini yükler, mevcut çeşitleri analiz eder ve en uygun bit hızında oynatmayı başlatır. Oynatma sırasında oynatıcı, segment indirme hızını ve arabellek doluluk seviyesini sürekli izleyerek daha yüksek veya daha düşük bir bit hızına geçip geçmeyeceğine karar verir. Modern ABR algoritmaları yalnızca ağ hızını değil, aynı zamanda arabellek boyutunu, içerik türünü ve hatta cihazın güç tüketimini de dikkate alır.
Kodlama ve dağıtımı doğru yapılandırmak ve oynatma sorunlarını gidermek için bir HLS akışının yapısını anlamak gerekir. Her HLS akışı, iki düzey çalma listesi ve katı bir hiyerarşi içinde düzenlenmiş çok sayıda medya segmentinden oluşur.
Ana çalma listesi, HLS oynatıcısı için giriş noktasıdır. .m3u8 uzantılı dosya, tüm akış çeşitlerine ve özelliklerine referanslar içerir. Oynatıcı önce bu dosyayı yükler ve bit hızları ve çözünürlükler hakkındaki bilgilere dayanarak hangi çeşidi seçeceğine dair ilk kararı verir. Ana çalma listesi ayrıca alternatif ses parçalarına, altyazılara ve hızlı arama için I-Frame çalma listelerine referanslar içerebilir.
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360
360p/video.m3u8
Medya çalma listesi, bir akış çeşidi için gerçek segment listesini içerir. Her segment, süresi ve URI’si ile belirtilir. Medya çalma listesi statik (VOD için — tüm segmentlerin tam listesi) veya dinamik olarak güncellenen (canlı yayın için — eski segmentler kaldırılır, yenileri eklenir) olabilir.
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:6.000,
segment001.ts
#EXTINF:6.000,
segment002.ts
#EXT-X-ENDLIST
HLS iki ana medya segment formatını destekler: MPEG-2 Transport Stream (.ts) ve Fragmented MP4 (.m4s veya .mp4). MPEG-2 TS, maksimum uyumluluk sağlayan orijinal HLS formatıdır. fMP4, HDR, HEVC ve daha verimli sıkıştırmayı destekleyen daha modern bir formattır. Apple, iOS 10 ve macOS Sierra’dan itibaren tüm yeni projeler için fMP4’ü önermektedir.
Ek HLS akış öğeleri arasında hızlı arama için I-Frame çalma listeleri, altyazıları ve reklam işaretçilerini senkronize etmek için ID3 meta verileri ve analiz sunucularına izleme bilgileri iletmek için Session Data bulunur. Tüm bu öğeler isteğe bağlıdır, ancak kullanımları kullanıcı deneyiminin kalitesini artırır.
HLS, birkaç mimari avantaj sayesinde video akış pazarına hakimdir, ancak belirli bir proje için protokol seçerken dikkate alınması gereken sınırlamaları da vardır. HLS’yi alternatif video dağıtım protokolleriyle karşılaştıralım.
| Özellik | HLS | DASH | RTMP |
|---|---|---|---|
| Taşıma | HTTP (80/443) | HTTP (80/443) | TCP (1935) |
| Uyarlanabilirlik | Evet (ABR) | Evet (ABR) | Hayır |
| Düşük Gecikme | 2–6 sn (LL-HLS) | 3–8 sn (LL-DASH) | 0.5–2 sn |
| HDR Desteği | Evet (iOS 11+) | Evet | Sınırlı |
| Yerel iOS | Evet (Safari, AVPlayer) | Üçüncü taraf oynatıcılarla | Hayır |
| CDN Basitliği | Maksimum (HTTP) | Maksimum (HTTP) | Özel sunucular |
Ana avantajı HLS’nin, yerleşik AVPlayer aracılığıyla tüm Apple cihazlarında (iPhone, iPad, Apple TV, Mac) yerel olarak desteklenmesidir. Bu, HLS’yi iOS/macOS uygulamaları için fiili standart haline getirir. Ayrıca, dağıtım için standart HTTP kullanımı, ek yapılandırma olmadan herhangi bir CDN ve proxy sunucuda içeriğin önbelleğe alınmasına olanak tanır ve bu da dağıtım altyapısını önemli ölçüde basitleştirir.
HLS’nin dezavantajları arasında canlı yayınlar için RTMP veya WebRTC’ye kıyasla daha yüksek gecikme bulunur. LL-HLS ile bile minimum gecikme 2–6 saniyedir ve bu, gerçek zamanlı etkileşimli senaryolar için kabul edilemez. Ayrıca HLS, sunucuda daha fazla dosya oluşturur (her segment ayrı bir dosyadır) ve bu, çok sayıda eşzamanlı akış olduğunda dosya sistemi üzerinde yük oluşturabilir.
HLS’nin mobil uygulamalara entegrasyonu platforma göre farklılık gösterir. iOS ve macOS’ta HLS, AVFoundation ve AVPlayer aracılığıyla işletim sistemi düzeyinde desteklenir ve donanım hızlandırmalı kod çözme ve minimum güç tüketimi sağlar. Android’de HLS, yerleşik MediaPlayer tarafından desteklenmez ancak Google’ın resmi medya oynatıcısı ExoPlayer aracılığıyla kullanılabilir.
Apple platformunda, AVPlayer içindeki yerleşik destek sayesinde HLS oynatma mümkün olduğunca basittir. Ana çalma listesi URL’si ile bir AVPlayer oluşturmanız yeterlidir; sistem otomatik olarak uyarlamalı bit hızı geçişini, ses parçası seçimini ve altyazı işlemeyi halleder. Geliştirici ayrıca AVPlayerItem ve AVAssetResourceLoader aracılığıyla oynatma üzerinde tam kontrole sahiptir.
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()
}
Android için, ayrı bir genişletme modülü aracılığıyla HLS’yi destekleyen ExoPlayer kullanılır. ExoPlayer, HLS akışı üzerinde daha ince ayarlı kontrol sağlar: bit hızı seçimini yönetmek, arabelleği yapılandırmak ve segment yükleme hatalarını ayrı ayrı ele almak mümkündür. LL-HLS, ExoPlayer sürüm 2.14.0 veya üstünü gerektirir.
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()
Mobil uygulamalar, hücresel ağların kararsızlığı ve trafik sınırlamaları nedeniyle HLS yapılandırmasına özel bir yaklaşım gerektirir. Başlıca öneriler şunları içerir: ağ türüne (Wi-Fi veya hücresel) göre başlangıç bit hızını yapılandırma, daha hızlı uyum için daha kısa segment süreleri (2–4 saniye) kullanma, Wi-Fi’ye geçerken arabelleği önceden yükleme ve zayıf sinyalde ses parçasına öncelik verme.
Apple, HLS Authoring Specification for Apple Devices (2024) belgesinde mobil cihazlar için 6 saniyeyi geçmeyen segment boyutu ve en az 4 bit hızı çeşidi kullanılmasını önermektedir. Mobil ağlarda trafikten tasarruf etmek için sunucu, içeriğin telekom operatörlerinin ara proxy sunucularında önbelleğe alınmasına izin veren Cache-Control HTTP başlığıyla segmentleri göndermelidir.
Sıkça Sorulan Sorular
MP4, oynatma başlamadan önce tamamen indirilmesi gereken bir video dosyasının tamamını depolamak için bir kapsayıcıdır. HLS, videoyu küçük segmentlere bölerek ilk segment yüklendikten 2–6 saniye sonra izlemeye başlamayı sağlar ve kaliteyi internet hızına göre otomatik olarak uyarlar.
Evet, HLS Apple sunucu yazılımı gerektirmez. Herhangi bir HTTP sunucusu (Nginx, Apache, CDN) HLS içeriğini dağıtabilir. Videoyu HLS’ye kodlamak için FFmpeg veya profesyonel kodlayıcılar kullanılır. Tek gereksinim, .m3u8 dosyaları için doğru MIME türü yapılandırmasıdır.
Evet, HLS başlangıçta canlı yayın için geliştirilmiştir. Canlı yayın sırasında medya çalma listesi dinamik olarak güncellenir: sunucu yeni segmentler ekler ve eskilerini kaldırır. Low-Latency HLS (LL-HLS), gecikmeyi 2–6 saniyeye düşürerek HLS’yi spor yayınları ve haber bültenleri için uygun hale getirir.
Ana çalma listesi, aynı içeriğin farklı bit hızları ve çözünürlüklerdeki tüm çeşitlerini birleştirir. Oynatıcı önce bunu yükler, her çeşidin özelliklerini (bit hızı, çözünürlük, codec) analiz eder ve mevcut ağ koşulları için en uygun olanı seçer. Ana çalma listesi olmadan uyarlamalı kalite geçişi mümkün değildir.
HLS, segmentlerin AES-128 şifrelemesini ve DRM sistemleriyle (FairPlay Streaming (Apple), Widevine (Google), PlayReady (Microsoft)) entegrasyonu destekler. Şifreleme anahtarları ayrı bir güvenli kanal üzerinden iletilir. Ek koruma için çalma listesi erişiminde token tabanlı kimlik doğrulama kullanılır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun