Video neden sunduğunuz her şeyden farklı
Bir web sayfası birkaç megabayttır. On dakikalık 1080p video, izleyici başına gigabayt mertebesindedir. Bu üç kat büyüklük farkı, sayfa görüntülemesi olarak yuvarlama hatası sayılacak bir videonun, popüler olduğu gün origin sunucusunu doyurabilmesinin sebebidir: tek dosyanın yüz eşzamanlı izleyicisi, tek makineden yüz kesintisiz yüksek-bant-genişlikli akış demektir.
Ekonomi de aynı eğriyi izler. Egress'i gigabayt başına faturalayan sağlayıcılarda orta halli başarılı bir video fark edilir bir faturadır; viral olanı finans departmanından gelen bir telefondur. İki problem de — bant genişliği tavanı ve fatura — diğer tüm statik içerik problemleriyle aynı şekildedir; yani çözümleri de aynıdır: tekrar eden istekleri her seferinde origin'den değil, izleyiciye yakın bir cache'ten cevaplamak.
HLS'in sırrı: bir playlist ve bir dosya klasörü
HLS (HTTP Live Streaming) dosyaları açana kadar egzotik görünür. Encoder videoyu kısa segmentlere böler — her biri birkaç saniye — ve bunları sırayla listeleyen düz metin bir playlist (.m3u8) yazar. Oynatıcı playlist'i indirir, sonra segmentleri sıradan HTTP üzerinden, gösterdiğinin birkaç saniye önünden teker teker çeker. Uyarlanabilir kalite aynı numaranın iki kez yapılmışıdır: bir master playlist birkaç varyant playlist'e işaret eder (1080p, 720p, 480p) ve oynatıcı bant genişliği değiştikçe aralarında atlar.
Sonuç açıkça söylenmeye değer: dağıtım yolunda özel bir video protokolü yoktur. Soket yok, streaming sunucusu yok, egzotik altyapı yok. Oynatıcının yaptığı her istek küçük bir statik dosya için GET'tir — ve milyonlarca kez sunulan küçük statik dosyalar, CDN edge'inin var olma sebebi olan iş yükünün ta kendisidir.
Bir varyant playlist — düz dosyalara işaret eden düz metin
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:6.000,
segment_000.ts
#EXTINF:6.000,
segment_001.ts
#EXTINF:6.000,
segment_002.ts
#EXT-X-ENDLIST
VOD hattı: bir kez encode et, bir kez depola, edge'den sun
Video-on-demand için hat üç istasyondan oluşur. Bir kez encode edin — kendi makinenizde ya da build'inizde; ffmpeg kaynak videoyu tek komutla playlist-artı-segmentler klasörüne çevirir. Bir kez depolayın — tam da böyle bir-kez-yazılıp-çok-okunan dosyalar için var olan S3 uyumlu object storage'da. Edge'den sunun: bucket CDN arkasındayken her segmentin ilk izleyicisi cache'i doldurur ve sonraki herkes bulunduğu yere yakından cevaplanır; depolamanız her benzersiz dosyayı kabaca bir kez cevaplar.
cdn.com.tr'de depolama ile edge tek platformdur, yani bu bir entegrasyon projesi değildir: bucket açın, klasörü yükleyin — aynı hesabın edge'i, WAF ve DDoS koruması dahil, önünde durur.
Kaynak dosyadan CDN'den sunulan yayına
# 1) HLS'e encode et (6 saniyelik segmentler, kisalik icin tek kalite)
ffmpeg -i sunum.mp4 -c:v h264 -c:a aac \
-hls_time 6 -hls_playlist_type vod \
-hls_segment_filename 'sunum/segment_%03d.ts' sunum/playlist.m3u8
# 2) bucket ve erisim anahtari olustur (panel de olur)
cdnctl object-storage buckets create --account <uuid> --name videos
cdnctl object-storage access-keys create --account <uuid> --bucket <bucket_uuid>
# 3) klasoru standart AWS CLI ile yukle
aws --endpoint-url https://s3.cdn.com.tr s3 sync ./sunum s3://videos/sunum
# oynatici artik CDN hostname'iniz arkasindaki playlist'e bakar:
# https://video.example.com/sunum/playlist.m3u8
Video dağıtımını yapan ya da bozan cache kuralları
Video, diğer içeriklerin yalnızca takdir ettiği cache-başlığı disiplinini ödüllendirir; çünkü bir HLS yayınındaki iki dosya tipi taban tabana zıt muamele ister.
Segmentler yapıları gereği değişmezdir — segment_042.ts asla farklı bayt içermeyecektir, çünkü yeniden encode yeni bir klasör yazar. İstediğiniz kadar uzun cache'leyin; bir yıl pervasızlık değil, doğrusudur. Uzun cache'lenen her segment, origin'inizin bir daha asla sunmayacağı bant genişliğidir.
Playlist hareketli parçadır. Bitmiş VOD için yalnızca videoyu değiştirdiğinizde değişir; bir saat yeterlidir. Playlist'e ekleme yapılmaya başlandığı anda — canlıya-yakın senaryoların çalışma şekli budur — saniyelerle cache'lenmelidir, çünkü oynatıcı yeni segmentleri keşfetmek için onu tekrar tekrar okur. Bu tek başlığı yanlış ayarlamak klasik video hatasıdır: izleyiciler eski segmentlerde donmuş, playlist ise onlara yeni bir şey olmadığını söylüyordur.
cdn.com.tr'de tam bu ayrımı panelde dağıtım kuralı olarak kurarsınız: segment yoluna uzun süreli bir kural, *.m3u8'e kısa süreli bir kural.
Isıran ayrıntılar: range, CORS ve sıkıştırma
Üç pratik not, video destek taleplerinin çoğunu önler. Birincisi range istekleri: oynatıcılar ve tarayıcılar medya dosyalarının bayt aralıklarını rutin olarak ister ve edge kısmi içeriği cache'ten sunar — izleyicinin bir MP4'te birinci-beşinci dakikaları indirmeden altıncı dakikaya atlayabilmesini sağlayan da budur.
İkincisi CORS: oynatıcı video dosyalarından farklı bir hostname'de çalışıyorsa tarayıcı, segment ve playlist'lerde Access-Control-Allow-Origin başlıkları talep eder; unutmanın belirtisi, boş sekmede çalışıp sayfanıza gömülünce çalışmayan oynatıcıdır.
Üçüncüsü sıkıştırma: medya için kapalı bırakın. Video ve ses codec tarafından zaten sıkıştırılmıştır; bir .ts segmentini gzip'lemek hiçbir şey kazanmadan CPU harcar. Playlist'leri isterseniz sıkıştırın — metindirler — ama kazanç mikroskobiktir. Edge medya tiplerini yeniden sıkıştırmamayı zaten bilir; not, kendi origin yapılandırmanız için önemlidir.
Peki canlı yayın? Dürüst cevap
Canlı, aynı dağıtım hikâyesinin daha zor tedarik zincirli hâlidir. Dağıtım yarısı birebir aynıdır: canlı bir HLS yayını hâlâ playlist ve segmentlerdir; yalnızca playlist birkaç saniyede bir büyür ve çok kısa cache'lenir. Edge bunu güzelce sunar — saniyeler yaşındaki dosyaları okuyan binlerce izleyici hâlâ sadece cache hit'idir.
Canlının eklediği şey, dosyalar var olmadan önceki her şeydir: alım (kamera beslemesini RTMP ya da SRT ile almak), gerçek zamanlı transcode ile kalite merdiveni ve paketleme — bir kez yüklediğiniz bir klasör değil, kendi arıza kipleri olan çalışan bir hattır. O hat gelişigüzel kurulacak bir şey değildir ve bu platformun self-servis ürününün yaptığı iş de değildir: cdn.com.tr hikâyenin depolama-ve-dağıtım yarısıdır. Projeniz tam canlı zincire ihtiyaç duyuyorsa bunu VOD şekilli bir akışa zorlamak yerine bizimle doğrudan konuşun — ve encoder'ı kimin işlettiğini söylemeden "canlı yayın" satan her sağlayıcıya temkinli yaklaşın.
Sık sorulan sorular
HLS yerine doğrudan MP4 dosyası sunamaz mıyım?
Kısa klipler için evet — CDN arkasında range destekli bir MP4 çalışır ve oynatıcılar içinde gezinebilir. HLS karmaşıklığını videolar uzayınca ya da izleyici çeşitlenince hak eder: uyarlanabilir kalite, daha hızlı başlangıç ve tek büyük dosyadan daha iyi cache'lenip devam eden küçük segmentler.
cdn.com.tr videolarımı encode eder mi?
Hayır — encoding hattın sizin tarafınızdır (yerelde ya da CI'da ffmpeg standart yoldur; yukarıdaki komut eksiksiz bir başlangıçtır). Platform, encode edilmiş çıktıyı object storage'da depolar ve edge üzerinden dağıtır.
Bir video viral olursa ne olur?
Mimarinin var olma sebebi tam da bu senaryodur: her edge noktasındaki ilk izleyiciden sonra segmentler cache'ten cevaplanır; origin yükü yerinden kıpırdamazken dağıtım edge ile ölçeklenir. Dikkat edilecek şey cache başlıklarınızdır — matematiği işleten, uzun cache'lenmiş değişmez segmentlerdir.
İzleyicilere eski-yeni karışığı göstermeden bir videoyu nasıl değiştiririm?
YENİ bir klasöre encode edin (sunum-v2/) ve oynatıcıyı yeni playlist URL'ine çevirin — eski cache'li segmentler yanlış değil, alakasız hâle gelir; purge gerekmez. Yerinde üzerine yazıp purge etmek de çalışır ama sürümlü yollar, tıpkı diğer statik varlıklarda olduğu gibi, daha sakin desendir.