DEV Community

yqqwe
yqqwe

Posted on

Bilibili Video İndirici Mühendisliği: DASH Protokolü, M4S Segmentasyonu ve FFmpeg ile Medya İşleme

Giriş

Modern web ekosisteminde medya verilerini ayrıştırmak ve arşivlemek, geliştiriciler için her zaman ilgi çekici bir konu olmuştur. "Çin'in YouTube'u" olarak bilinen Bilibili, sadece devasa bir içerik kütüphanesine sahip olmakla kalmaz, aynı zamanda standart MP4 dosyalarından çok daha karmaşık bir dinamik uyarlamalı akış (DASH) altyapısı kullanır.
Kısa süre önce yayına aldığım Bilibili Video İndirici, bu teknik zorlukları otomatize etmek için tasarlandı. Bu yazıda, Bilibili'nin medya dağıtım katmanlarını, ID dönüşüm algoritmalarını ve arka planda yüksek performanslı medya birleştirme işlemlerini nasıl yönettiğimizi teknik detaylarıyla inceleyeceğiz.

1. ID Mimarisi: AV ve BV Arasındaki Dönüşüm Mantığı

Bir videoyu indirmeye başlamadan önce, onu doğru şekilde tanımlamanız gerekir. Bilibili, her indiricinin çözmesi gereken iki farklı ID sistemi kullanır.
AV'den BV'ye Geçiş
Bilibili başlangıçta basit artımlı tamsayılar olan AV numaralarını (örneğin av12345) kullanıyordu. Ancak, botların tüm siteyi kolayca taramasını engellemek için 2020 yılında Base-58 tabanlı BV ID sistemine (örneğin BV17x411w7KC) geçiş yapıldı.
Teknik Zorluk: twittervideodownloaderx.com/bilibili_downloader_tu gibi sağlam bir araç oluşturmak için çift yönlü bir dönüşüm algoritması uygulamamız gerekiyordu. Bu süreç; özel bir karakter tablosu (fZodR9...), bit düzeyinde işlemler (bitwise) ve belirli "sihirli sayılarla" XOR işlemlerini içerir. Bu mantığı anlamak, herhangi bir Bilibili URL'sini sorgulanabilir bir meta veri nesnesine dönüştürmenin ilk adımıdır.

2. Temel Mücadele: DASH Protokolü ve M4S Ayrıştırma

Bilibili'den yüksek kalitede video indirmenin önündeki en büyük engel, DASH (Dynamic Adaptive Streaming over HTTP) protokolüdür.
Görüntü ve Ses Ayrımı (V/A Separation)
Standart platformların aksine, Bilibili görüntü ve ses akışlarını ayrı M4S dosyaları olarak sunar.
• Neden? Bu, oynatıcının bant genişliğine bağlı olarak ses akışını kesmeden video çözünürlüğünü (örneğin 720p'den 1080p'ye) dinamik olarak değiştirmesine olanak tanır.
• Geliştirici İçin Zorluk: İndirme motorumuz sadece bir linki yakalayamaz. API üzerinden playurl yanıtını almalı, en yüksek kaliteli video akış URL'sini bulmalı, karşılık gelen ses akış URL'sini seçmeli ve bunları eş zamanlı olarak indirmelidir.

3. 403 Forbidden Hatasıyla Mücadele: CDN Güvenliği

Bilibili'nin CDN (İçerik Dağıtım Ağı) oldukça agresiftir. Standart bir curl veya fetch isteğiyle bir M4S segmentini indirmeye çalışırsanız, sistem otomatik olarak 403 Forbidden hatası döndürür.
Referer ve Session Manipülasyonu
Bu engeli aşmak için indiricimiz katı bir başlık (header) taklit stratejisi izler:

  1. Referer Kontrolü: HTTP başlığındaki Referer alanı mutlaka https://www.bilibili.com/ olarak ayarlanmalıdır.
  2. User-Agent Döngüsü: Parmak izi takibini önlemek için modern tarayıcı dizilerinden oluşan bir havuz kullanıyoruz.
  3. Oturum Yönetimi: 1080P (Yüksek Bit Hızı) veya 4K içeriklere erişmek için geçerli oturum çerezleri (SESSDATA) gereklidir. Arka uç motorumuz, kalitenin 360p'ye düşürülmesini önlemek için bu oturumları yönetir.

4. Arka Uç Mimarisi: Ölçeklenebilir Performans

Küresel bir kullanıcı kitlesine hizmet vermek için indiriciyi, I/O yoğunluklu görevler için optimize edilmiş bir Python/Django yığını üzerine inşa ettik.
Httpx ile Asenkron I/O
Medya ayrıştırma işlemleri yoğun I/O gerektirir. Paralel görevleri yürütmek için httpx ve asyncio kullanıyoruz:
• Görev A: Video meta verilerini (başlık, küçük resim, süre) getir.
• Görev B: DASH akış uç noktalarını müzakere et.
• Görev C: CDN üzerindeki dosyaların erişilebilirliğini doğrula.
Bu işlemleri bir olay döngüsü (event loop) içinde çalıştırarak, yanıt süresini (TTFB) %60'tan fazla azalttık.
FFmpeg ile Kayıpsız Birleştirme (Muxing)
Elimizde ayrı video ve ses dosyaları olduğunda, kullanıcıya tek bir .mp4 sunmamız gerekir. Videoyu yeniden kodlamak (transcoding) CPU'yu tüketir ve kalite kaybına neden olur. Bunun yerine FFmpeg stream copying kullanıyoruz:
Bash
ffmpeg -i video_akisi.m4s -i ses_akisi.m4s -c copy -map 0✌️0 -map 1🅰️0 cikti.mp4
Teknik İpucu: -c copy bayrağı kritiktir. FFmpeg'e veri paketlerini piksellere dokunmadan sadece yeni bir konteynere taşımasını söyler. Bu işlem %100 kayıpsızdır ve milisaniyeler içinde tamamlanır.

5. Kullanıcı Deneyimi ve Yerelleştirme

Teknik bir araç, ancak erişilebilir olduğu sürece değerlidir. Türkiye'deki geliştiriciler ve kullanıcılar için Türkçe versiyonumuzu optimize ettik:
• Duyarlı Tasarım: Mobil ve masaüstü cihazlarda sorunsuz çalışma.
• Gizlilik ve Güvenlik: İşlemler sunucu tarafında gerçekleşir, kullanıcıların tehlikeli tarayıcı eklentileri yüklemesine gerek kalmaz.

Sonuç

Yüksek performanslı bir Bilibili indirici oluşturmak, sadece bir link çekme görevi değil; modern akış protokollerini, API tersine mühendisliğini ve verimli medya işlemeyi anlama egzersizidir. Eğer medya mühendisliği ile ilgileniyorsanız veya Bilibili içeriklerini orijinal kalitesinde arşivlemek için güvenilir bir yol arıyorsanız, projemizi incelemenizi öneririm.
👉 Buradan Deneyin: Bilibili Video İndirici
Teknik Yığın Özeti:
• Backend: Python / Django / Redis
• Medya İşleme: FFmpeg (Stream Copy Modu)
• Ağ: Httpx / Asyncio
• Frontend: Vanilla JS / CSS3
DASH ayrıştırma veya FFmpeg kullanımı hakkında sorularınız varsa, yorumlarda tartışalım!

WebDev #Python #Bilibili #Programming #VideoProcessing #FFmpeg #OpenSource #TurkeyTech

Top comments (0)