Video kodlamasını səkkiz dəfə necə sürətləndirdik

Video kodlamasını səkkiz dəfə necə sürətləndirdik

Hər gün milyonlarla izləyici internetdə videolara baxır. Amma videonun əlçatan olması üçün o, təkcə serverə yüklənməməli, həm də işlənməlidir. Bu nə qədər tez baş verərsə, xidmət və onun istifadəçiləri üçün bir o qədər yaxşıdır.

Adım Askar Kamalov, bir il əvvəl Yandex video texnologiya komandasına qoşulmuşam. Bu gün Habr oxucularına kodlaşdırma prosesini paralelləşdirməklə videonun istifadəçiyə çatdırılmasını necə əhəmiyyətli dərəcədə sürətləndirə bildiyimizi qısaca izah edəcəyəm.

Bu yazı, ilk növbədə, video xidmətlərinin başlığı altında nə baş verdiyini əvvəllər düşünməyənlər üçün maraqlı olacaq. Şərhlərdə suallar verə və gələcək yazılar üçün mövzular təklif edə bilərsiniz.

Tapşırığın özü haqqında bir neçə kəlmə. Yandex yalnız başqa saytlarda video axtarmağa kömək etmir, həm də öz xidmətləri üçün videoları saxlayır. İstər orijinal proqram, istərsə də efirdəki idman oyunu, KinoPoisk-də film və ya Zen və News-da videolar - bunların hamısı serverlərimizə yüklənir. İstifadəçilərin videoya baxması üçün onu hazırlamaq lazımdır: tələb olunan formata çevirmək, önizləmə yaratmaq və ya hətta texnologiya vasitəsilə işləmək. DeepHD. Hazırlanmamış fayl sadəcə yer tutur. Üstəlik, söhbət təkcə aparatdan optimal istifadədən deyil, həm də məzmunun istifadəçilərə çatdırılma sürətindən gedir. Nümunə: xokkey matçının həlledici anının qeydini hadisənin özündən sonra bir dəqiqə ərzində axtarmaq olar.

Ardıcıl kodlaşdırma

Beləliklə, istifadəçinin xoşbəxtliyi əsasən videonun nə qədər tez əlçatan olmasından asılıdır. Və bu, əsasən transcoding sürəti ilə müəyyən edilir. Video yükləmə sürəti üçün ciddi tələblər olmadıqda, heç bir problem yoxdur. Siz vahid, bölünməz bir fayl götürürsünüz, onu çevirirsiniz və yükləyirsiniz. Səyahətimizin əvvəlində belə işlədik:

Video kodlamasını səkkiz dəfə necə sürətləndirdik

Müştəri videonu yaddaşa yükləyir, Analizator komponenti meta məlumat toplayır və videonu konvertasiya üçün İşçi komponentinə ötürür. Bütün mərhələlər ardıcıl olaraq həyata keçirilir. Bu halda, çoxlu kodlaşdırma serverləri ola bilər, lakin yalnız biri müəyyən bir videonu emal etməklə məşğuldur. Sadə, şəffaf diaqram. Onun üstünlükləri burada sona çatır. Bu sxem yalnız şaquli olaraq ölçülə bilər (daha güclü serverlərin alınması səbəbindən).

Ara nəticə ilə ardıcıl kodlaşdırma

Ağrılı gözləməni birtəhər düzəltmək üçün sənaye sürətli kodlaşdırma seçimi ilə gəldi. Ad yanlışdır, çünki əslində tam kodlaşdırma ardıcıl olaraq baş verir və bir o qədər uzun çəkir. Ancaq orta nəticə ilə. İdeya budur: videonun aşağı rezolyusiyaya malik versiyasını mümkün qədər tez hazırlayın və dərc edin və yalnız bundan sonra daha yüksək rezolyusiyaya malik versiyaları hazırlayın.

Bir tərəfdən, video daha tez əlçatan olur. Və mühüm hadisələr üçün faydalıdır. Amma digər tərəfdən, şəkil bulanıq çıxır və bu, izləyiciləri bezdirir.

Belə çıxır ki, videonu nəinki tez emal etmək, həm də keyfiyyətini qorumaq lazımdır. İndi istifadəçilərin video xidmətindən gözlədikləri budur. Görünə bilər ki, ən məhsuldar serverləri almaq kifayətdir (və onların hamısını bir anda təkmilləşdirmək). Ancaq bu, çıxılmaz bir nöqtədir, çünki həmişə ən güclü avadanlıqları belə yavaşlatacaq bir video var.

Paralel kodlaşdırma

Mürəkkəb bir problemi bir çox daha az mürəkkəb olanlara bölmək və müxtəlif serverlərdə paralel olaraq həll etmək daha səmərəlidir. Bu, video üçün MapReduce-dir. Bu halda, biz bir serverin performansı ilə məhdudlaşmırıq və üfüqi olaraq miqyaslaya bilərik (yeni maşınlar əlavə etməklə).

Yeri gəlmişkən, videoları kiçik parçalara bölmək, paralel olaraq emal etmək və bir-birinə yapışdırmaq fikri heç də sirr deyil. Bu yanaşmaya bir çox istinad tapa bilərsiniz (məsələn, Habré-də layihə haqqında bir yazı tövsiyə edirəm DistVIDc). Ancaq bu, işi asanlaşdırmır, çünki siz sadəcə hazır bir həll götürüb onu evinizdə tikə bilməzsiniz. İnfrastrukturumuza, videomuza və hətta yükümüzə uyğunlaşmaya ehtiyacımız var. Ümumiyyətlə, özünüz yazmaq daha asandır.

Beləliklə, yeni arxitekturada ardıcıl kodlaşdırma ilə monolit İşçi blokunu Segmenter, Tcoder, Combiner mikroservislərinə böldük.

Video kodlamasını səkkiz dəfə necə sürətləndirdik

  1. Segmenter videonu təxminən 10 saniyəlik fraqmentlərə bölür. Fraqmentlər bir və ya daha çox GOP-dan ibarətdir (şəkillər qrupu). Hər bir GOP müstəqildir və ayrıca kodlaşdırılır ki, digər GOP-ların çərçivələrinə istinad etmədən deşifrə edilə bilsin. Yəni fraqmentlər bir-birindən asılı olmayaraq ifa edilə bilər. Bu parçalanma gecikməni azaldır, emalın daha erkən başlamasına imkan verir.
  2. Tcoder hər bir fraqmenti emal edir. O, növbədən tapşırığı götürür, yaddaşdan fraqmenti endirir, onu müxtəlif rezolyusiyalarda kodlayır (yadda saxlayın ki, oyunçu qoşulma sürətinə əsasən versiya seçə bilər), sonra nəticəni yaddaşa qaytarır və fraqmenti işlənmiş kimi qeyd edir. verilənlər bazasında. Bütün fraqmentləri emal etdikdən sonra Tcoder növbəti komponent üçün nəticələr yaratmaq üçün tapşırığı göndərir.
  3. Combiner nəticələri birlikdə toplayır: Tcoder tərəfindən hazırlanmış bütün fraqmentləri yükləyir, müxtəlif qətnamələr üçün axınlar yaradır.

Səs haqqında bir neçə kəlmə. Ən məşhur AAC audio codecində xoşagəlməz bir xüsusiyyət var. Əgər siz fraqmentləri ayrı-ayrılıqda kodlasanız, onda siz onları asanlıqla bir-birinə yapışdıra bilməyəcəksiniz. Keçidlər nəzərə çarpacaq. Video kodeklərdə bu problem yoxdur. Teorik olaraq, siz mürəkkəb texniki həll yolu axtara bilərsiniz, lakin bu oyun sadəcə olaraq hələ də şam etməyə dəyməz (audionun çəkisi videodan xeyli azdır). Buna görə paralel olaraq yalnız video kodlaşdırılır və bütün audio trek işlənir.

Tapıntılar

Paralel videonun işlənməsi sayəsində videonun bizə yüklənməsi ilə istifadəçilər üçün əlçatan olması arasındakı gecikməni əhəmiyyətli dərəcədə azaltdıq. Məsələn, əvvəllər bir saat yarım davam edən FullHD filmi üçün müxtəlif keyfiyyətli bir neçə tam versiyanın yaradılması iki saat çəkə bilərdi. İndi bütün bunlar 15 dəqiqə çəkir. Üstəlik, paralel emal ilə biz köhnə ara nəticə yanaşması ilə aşağı rezolyusiyaya malik versiyadan daha sürətli yüksək keyfiyyətli versiya yaradırıq.

Və daha bir şey. Köhnə yanaşma ilə ya kifayət qədər server yox idi, ya da tapşırıqlar olmadan boş idi. Paralel kodlaşdırma dəmirin təkrar emalının payını artırmağa imkan verir. İndi mindən çox serverdən ibarət klasterimiz həmişə nə iləsə məşğuldur.

Əslində, təkmilləşdirmə üçün hələ imkanlar var. Məsələn, videonun fraqmentlərini tam olaraq bizə çatana qədər emal etməyə başlasaq, əhəmiyyətli vaxta qənaət edə bilərik. Necə deyərlər, daha çox gələcək.

Video ilə işləmək sahəsində hansı tapşırıqlar haqqında oxumaq istədiyinizi şərhlərdə yazın.

Sənaye həmkarlarının təcrübəsinə faydalı bağlantılar

Mənbə: www.habr.com

Добавить комментарий