Video kodlamayı sekiz kat nasıl hızlandırdık?

Video kodlamayı sekiz kat nasıl hızlandırdık?

Her gün milyonlarca izleyici internette video izliyor. Ancak videonun kullanılabilir olması için yalnızca sunucuya yüklenmesi değil aynı zamanda işlenmesi de gerekir. Bu ne kadar hızlı olursa, hizmet ve kullanıcıları için o kadar iyi olur.

Adım Askar Kamalov, bir yıl önce Yandex video teknolojisi ekibine katıldım. Bugün Habr okuyucularına, kodlama sürecini paralel hale getirerek videonun kullanıcıya dağıtımını nasıl önemli ölçüde hızlandırmayı başardığımızı kısaca anlatacağım.

Bu yazı öncelikle video hizmetlerinin başlığı altında neler olduğunu daha önce düşünmemiş olanların ilgisini çekecektir. Yorumlarda sorular sorabilir ve gelecekteki gönderiler için konu önerebilirsiniz.

Görevin kendisi hakkında birkaç söz. Yandex yalnızca diğer sitelerdeki videoları aramanıza yardımcı olmakla kalmıyor, aynı zamanda kendi hizmetleri için de videolar saklıyor. İster orijinal bir program, ister canlı bir spor maçı, KinoPoisk'te bir film veya Zen ve News'te videolar olsun, bunların hepsi sunucularımıza yüklenir. Kullanıcıların videoyu izleyebilmesi için hazırlanması gerekir: gerekli formata dönüştürülmesi, bir önizleme oluşturulması ve hatta teknolojiyle çalıştırılması DeepHD. Hazırlanmamış bir dosya sadece yer kaplar. Üstelik sadece donanımın optimum kullanımından değil, aynı zamanda içeriğin kullanıcılara ulaştırılma hızından da bahsediyoruz. Örnek: Bir hokey maçının belirleyici anının kaydı, etkinlikten sonraki bir dakika içinde aranabilir.

Sıralı kodlama

Dolayısıyla kullanıcının mutluluğu büyük ölçüde videonun ne kadar hızlı kullanılabilir hale geldiğine bağlıdır. Ve bu esas olarak kod dönüştürme hızına göre belirlenir. Video yükleme hızına ilişkin katı gereksinimler olmadığında hiçbir sorun yaşanmaz. Tek, bölünmez bir dosya alırsınız, dönüştürürsünüz ve yüklersiniz. Yolculuğumuzun başında şu şekilde çalıştık:

Video kodlamayı sekiz kat nasıl hızlandırdık?

İstemci videoyu depolamaya yükler, Analizör bileşeni meta bilgileri toplar ve videoyu dönüşüm için Çalışan bileşenine aktarır. Tüm aşamalar sırayla gerçekleştirilir. Bu durumda, çok sayıda kodlama sunucusu olabilir, ancak yalnızca bir tanesi belirli bir videoyu işlemekle meşguldür. Basit, şeffaf diyagram. Avantajlarının bittiği yer burasıdır. Bu şema yalnızca dikey olarak ölçeklendirilebilir (daha güçlü sunucuların satın alınması nedeniyle).

Ara sonuçla sıralı kodlama

Sektör, bu acı dolu bekleyişi bir şekilde hafifletmek için hızlı bir kodlama seçeneği sundu. İsim yanıltıcıdır çünkü aslında tam kodlama sırayla gerçekleşir ve bir o kadar da uzun sürer. Ancak ara bir sonuçla. Buradaki fikir şudur: Videonun düşük çözünürlüklü versiyonunu mümkün olduğu kadar çabuk hazırlayın ve yayınlayın, ancak o zaman daha yüksek çözünürlüklü versiyonlarını hazırlayın ve yayınlayın.

Bir yandan video daha hızlı kullanılabilir hale geliyor. Ve önemli olaylar için faydalıdır. Ancak öte yandan görüntü bulanık çıkıyor ve bu da izleyenleri rahatsız ediyor.

Videoyu yalnızca hızlı bir şekilde işlemeniz değil, aynı zamanda kalitesini de korumanız gerektiği ortaya çıktı. Kullanıcıların artık bir video hizmetinden beklediği şey budur. En verimli sunucuları satın almak (ve hepsini aynı anda düzenli olarak yükseltmek) yeterli gibi görünebilir. Ancak bu bir çıkmaz sokak çünkü her zaman en güçlü donanımları bile yavaşlatacak bir video vardır.

Paralel kodlama

Karmaşık bir sorunu daha az karmaşık olan birçok soruna bölmek ve bunları farklı sunucularda paralel olarak çözmek çok daha verimlidir. Bu video için MapReduce'tur. Bu durumda tek bir sunucunun performansıyla sınırlı kalmıyoruz ve yatay olarak (yeni makineler ekleyerek) ölçeklendirebiliyoruz.

Bu arada videoları küçük parçalara bölüp paralel olarak işleyip birbirine yapıştırma fikri bir sır değil. Bu yaklaşıma ilişkin pek çok referans bulabilirsiniz (örneğin, Habré'de proje hakkında bir yazı öneriyorum) DistVIDc). Ancak bu genel olarak durumu kolaylaştırmıyor çünkü hazır bir çözümü alıp evinize yerleştiremezsiniz. Altyapımıza, videomuza ve hatta yükümüze uyum sağlamamız gerekiyor. Genel olarak kendinizinkini yazmak daha kolaydır.

Böylece, yeni mimaride sıralı kodlamaya sahip monolitik Worker bloğunu Segmenter, Tcoder, Combiner mikro hizmetlerine böldük.

Video kodlamayı sekiz kat nasıl hızlandırdık?

  1. Segmenter videoyu yaklaşık 10 saniyelik parçalara böler. Parçalar bir veya daha fazla GOP'tan oluşur (resim grubu). Her GOP bağımsızdır ve ayrı olarak kodlanır, böylece diğer GOP'lardan gelen çerçevelere referans olmadan kodu çözülebilir. Yani parçalar birbirinden bağımsız olarak çalınabilir. Bu parçalama gecikmeyi azaltarak işlemenin daha erken başlamasına olanak tanır.
  2. Tcoder her parçayı işler. Sıradan bir görevi alır, depodan bir parça indirir, onu farklı çözünürlüklerde kodlar (oyuncunun bağlantı hızına göre bir sürüm seçebileceğini unutmayın), ardından sonucu tekrar depoya koyar ve parçayı işlenmiş olarak işaretler veritabanında. Tüm parçaları işledikten sonra Tcoder, bir sonraki bileşen için sonuç üretme görevini gönderir.
  3. Combiner sonuçları bir araya toplar: Tcoder tarafından oluşturulan tüm parçaları indirir, farklı çözünürlükler için akışlar oluşturur.

Ses hakkında birkaç söz. En popüler AAC ses codec bileşeninin hoş olmayan bir özelliği vardır. Parçaları ayrı ayrı kodlarsanız bunları sorunsuz bir şekilde birbirine yapıştıramazsınız. Geçişler farkedilecek. Video codec bileşenlerinde bu sorun yoktur. Teorik olarak, karmaşık bir teknik çözüm arayabilirsiniz, ancak bu oyun henüz muma değmez (ses, videodan çok daha hafiftir). Bu nedenle yalnızca video paralel olarak kodlanır ve ses parçasının tamamı işlenir.

Bulgular

Paralel video işleme sayesinde, bir videonun bize yüklenmesi ile kullanıcılara sunulması arasındaki gecikmeyi önemli ölçüde azalttık. Örneğin, daha önce bir buçuk saat süren bir FullHD filmin farklı kalitede birkaç tam sürümünün oluşturulması iki saat sürüyordu. Şimdi tüm bunlar 15 dakika sürüyor. Üstelik paralel işleme ile eski ara sonuç yaklaşımıyla düşük çözünürlüklü versiyondan çok daha hızlı bir şekilde yüksek çözünürlüklü versiyon oluşturuyoruz.

Ve bir şey daha. Eski yaklaşımla ya yeterli sayıda sunucu yoktu ya da görevleri olmadan atıl durumdaydılar. Paralel kodlama, demir geri dönüşümünün payını artırmanıza olanak tanır. Artık binden fazla sunucudan oluşan kümemiz her zaman bir şeylerle meşgul.

Aslında hâlâ geliştirilecek noktalar var. Örneğin, videonun tamamını bize ulaşmadan önce parçalarını işlemeye başlarsak, önemli ölçüde zaman kazanabiliriz. Dedikleri gibi, daha fazlası gelecek.

Videoyla çalışma alanında hangi görevleri okumak istediğinizi yorumlara yazın.

Sektördeki meslektaşlarımızın deneyimlerine faydalı bağlantılar

Kaynak: habr.com

Yorum ekle