NYTimes Video Streaming Mimarisi: HLS ve FFmpeg ile Yüksek Performanslı Ekstraksiyon Motoru Oluşturmak
Source: Dev.to
Giriş
Bir yazılım geliştiricisi olarak, küresel ölçekteki platformların multimedya verilerini nasıl yönettiğini ve dağıttığını anlamak her zaman büyüleyici bir meydan okumadır. Dünyanın en saygın haber kuruluşlarından biri olan The New York Times (NYTimes), videolarını sunmak için basit bir statik dosya barındırma yöntemi yerine, dinamik ve uyarlanabilir bir yapı olan HLS (HTTP Live Streaming) protokolünü temel alan karmaşık bir dağıtım mimarisi kullanmaktadır.
NYTimes Video Downloader projesini hayata geçirdim. Bu makalede, işin mutfağına ineceğiz: HLS protokolü tersine mühendisliği, dinamik token doğrulama döngüleri ve sunucu tarafında kayıpsız birleştirme (lossless muxing) süreçlerini inceleyeceğiz.
Web’in ilk yıllarında bir videoyu indirmek oldukça basitti: <video> etiketinin src özniteliğine bakardınız ve genellikle statik bir .mp4 bağlantısına ulaşırdınız. Modern web ekosisteminde ise NYTimes, kullanıcıların değişen ağ koşullarına göre en iyi izleme deneyimini sunmak için HLS kullanıyor.
HLS Mimarisi
- Master Playlist: Farklı çözünürlükler (480p, 720p, 1080p vb.) için alt oynatma listelerini içerir.
- Media Playlist: Belirli bir çözünürlük için video segmentlerinin sırasını listeler; her segment genellikle 2 ila 6 saniye uzunluğundadır.
Teknik Zorluklar
Ekstraksiyon motorumuzun .m3u8 ağaç yapısını özyinelemeli (recursive) olarak ayrıştırabilmesi gerekir. Ayrıca, düşük bant genişliği için optimize edilmiş bulanık versiyonlar yerine, kullanıcının orijinal kaliteyi almasını sağlamak için En Yüksek Bit Hızına (Highest Bitrate) sahip kanalı otomatik olarak tanımlayıp izole etmelidir.
NYTimes, video API’leri için çok katmanlı bir koruma uygular. Standart bir curl komutu ile dahili medya arayüzlerine istek göndermeye çalışırsanız, muhtemelen 403 Forbidden veya 401 Unauthorized hatalarıyla karşılaşırsınız.
Asenkron Çekirdek ve Performans
Küresel indirme isteklerini desteklemek için nytimes_downloader_tu arka ucu, geleneksel bloklayıcı istek modellerini terk ederek tam bir Python Asyncio + httpx yığınına geçmiştir:
- Meta verileri çıkarmak için sayfa HTML’sinin ayrıştırılması.
- Medya yapılandırmaları için dahili REST veya GraphQL arayüzlerinin sorgulanması.
- Ağ üzerinden çok seviyeli
.m3u8dosyalarının özyinelemeli olarak getirilmesi.
Senkron bir modelde, bir işçi (worker) süreci ağ yanıtlarını beklerken boşta kalır. Asyncio aracılığıyla, tek bir süreç binlerce eşzamanlı çıkarma görevini yönetebilir; bu da sunucu donanım maliyetlerini önemli ölçüde düşürür ve yanıt sürelerini kısaltır.
Tüm HLS segmentlerini ayrıştırdıktan sonra, kullanıcıya tek bir bütünleşik MP4 dosyası sunmamız gerekir. Kullanıcıdan yüzlerce TS parçasını manuel olarak indirmesini istemek, felaket bir kullanıcı deneyimi (UX) olurdu.
Teknoloji Yığını Özeti
- Arka Uç: Python / Django / Redis / FFmpeg
- Mimari: Asyncio / Dağıtık Tarama
- Ön Uç: HTML5 / Tailwind CSS / Vanilla JS
- Altyapı: Cloudflare / Docker / Nginx
HLS ayrıştırma mantığını optimize ederek ve asenkron arka uç mimarilerinden yararlanarak kesintisiz bir 1080p video çıkarma deneyimi elde ettik.
WebDev #NYTimes #Python #FFmpeg #OpenSource #Programming #VideoStreaming #DevTools #TurkishDevelopers