
Hər gün milyonlarla izləyici internetdə videoları izləyir. Lakin, bir videonun istifadəçilərə təqdim edilməsi üçün onu yalnız serverə yükləmək kifayət etmir, eyni zamanda emal etmək də lazımdır. Bu proses nə qədər sürətli baş verirsə, xidmət və onun istifadəçiləri üçün bir o qədər yaxşıdır.
Mənim adım Askar Kamalovdur, bir il əvvəl Yandex-in video texnologiyaları komandasında işə başladım. Bu gün sizlərə video kodlaşdırma prosesinin paralelləşdirilməsi vasitəsilə istifadəçilərə video çatdırma müddətini necə əhəmiyyətli dərəcədə sürətləndirdiyimiz haqqında qısa məlumat verəcəyəm.
Bu post, xüsusən də daha əvvəl video xidmətlərin arxasında nələrin baş verdiyinə düşünməyənlər üçün maraqlı olacaq. Şərhlərdə suallar verilə bilər və gələcək postlar üçün mövzular təklif edilə bilər.
Bir neçə söz bu məsələnin mahiyyəti haqqında. Yandex yalnız başqa saytların videolarını tapmağa kömək etmir, eyni zamanda öz xidmətləri üçün videoları saxlayır. Bu, fərdi proqramlar, efirdə idman yarışları, KinoPoisk-də filmlər və ya Zen və Xəbərlərdəki kliplər olsun — bunların hamısı serverlərimizə yüklənir. İstifadəçilər videoları izləyə bilsinlər, bu videoları hazırlamaq lazımdır: lazım olan formata çevirmək, ön görüntü yaratmaq və ya hətta texnologiya vasitəsilə işlətmək. . Hazırlanmamış fayl sadəcə yer tutur. Burada yalnız hardware-in optimal istifadəsi deyil, eyni zamanda istifadəçilərə məzmunun çatdırılma sürəti də önəmlidir. Məsələn: həqiqətən həlledici bir anın video çəkilişi, hadisədən bir dəqiqə sonra axtarıla bilər.
Dava kodlaşdırma
Beləliklə, istifadəçinin məmnuniyyəti, videonun nə qədər tez əlçatan olmasından asılıdır. Və bu, əsasən, transkodu sürətindən asılıdır. Əgər video yayımının sürətində ciddi tələblər yoxdursa, problem də yoxdur. Siz birləşdirilmiş, bölünməz bir fayl alırsınız, onu çevirdikdən sonra yerləşdirirsiniz. Yolun əvvəlində biz də belə işləyirdik:

Müştəri videonu saxlanmaya yükləyir, Analyzer komponenti meta məlumatları toplayır və videonu konversiya üçün Worker komponentinə ötürür. Bütün mərhələlər sırayla icra olunur. Bu zaman kodlaşdırma üçün bir çox server ola bilər, lakin yalnız biri konkret videonun emalı ilə məşğuldur. Sadə, şəffaf sxema. Bunun üstünlükləri burada başa çatır. Belə bir sxema yalnız şaquli şəkildə genişlənir (daha güclü serverlərin alınması yolu ilə).
Aralıqlı nəticə ilə ardıcıl kodlaşdırma
Müxatirət gözləməsini bir az yumaq üçün, müəssisələr sürətli kodlaşdırma variantı tərtib etdilər. Aldadıcı ad, çünki əslində tam kodlaşdırma ardıcıldır və eyni dərəcədə uzun sürər. Amma nəticədə aralıq bir versiya meydana gəlir. Məqsəd budur: mümkün qədər sürətlə aşağı təsvirli video versiyasını hazırlayıb yerləşdirmək, sonra isə daha yüksək təsvirli versiyaları.
Bir tərəfdən, video daha tez bir zamanda əldə edilir. Və bu, mühüm hadisələr üçün faydalıdır. Lakin digər tərəfdən, görüntü bulanıq olur, bu da izləyiciləri rahatsız edir.
Beləliklə, videonu yalnız sürətlə emal etmək deyil, həm də keyfiyyətini qorumaq da lazım. Bu, müasir videoxidmət istifadəçilərinin gözlədiyi bir şeydir. Görünə bilər ki, ən güclü serverləri satın almaq kifayətdir (və onları müntəzəm olaraq yeniləmək). Amma bu, bir çıxılmaz yoldur, çünki həmişə ən güclü avadanlıqda belə sürətlənməyə səbəb olacaq bir video olacaq.
Paralel kodlaşdırma
Çətin bir tapşırığı daha çox az çətin tapşırıqlara bölmək və onları müxtəlif serverlərdə paralel olaraq həll etmək daha səmərəlidir. Bu, videolar üçün MapReduce kimidir. Bu vəziyyətdə bir serverin məhsuldarlığına bağlı qalmırıq və yeni maşınlar əlavə edərək horizontal olaraq ölçə bilərik.
Qeyd etmək lazımdır ki, videonu kiçik parçalara ayırmaq, paralel emal etmək və sonra birləşdirmək ideyası hər hansı bir sirr deyil. Bu yanaşmanı tapmaq üçün çoxlu istinadlar tapa bilərsiniz (məsələn, Habr-da bir postu tövsiyə edirəm ). Lakin bu, bütövlükdə asanlaşmır, çünki artıq hazır bir həlli götürüb öz sisteminizə daxil etmək olmur. Bizim infrastrukturumuza, videomuza və hətta yükümüzə uyğunlaşdırma lazımdır. Ümumilikdə, özünü yazmaq daha asandır.
Beləliklə, yeni arxitektura daxilində ardıcıl kodlaşdırma ilə monolit Worker bloku, Segmenter, Tcoder, Combiner mikroservislərinə bölünmüşdür.

- Segmenter, videonu təxminən 10 saniyəlik fraqmentlərə ayırır. Fraqmentlər bir və ya bir neçə GOP-dan ibarətdir (). Hər GOP müstəqil şəkildə kodlanır və başqalarına bağlı olmadan deşifrə olunur, yəni parçalar bir-birindən müstəqil şəkildə yenidən qurula bilər. Bu cür seqmentləşdirmə gecikməni azaldır, emalı daha tez başlamağa imkan verir.
- Tcoder hər parçanı emal edir. O, qeydiyyat sırasını alır, parçasını anbarlardan yükləyir, müxtəlif dəqiqliklərdə kodlayır (xatırladaq ki, pleyer bağlantı sürətinə əsaslanaraq versiyanı seçə bilər), daha sonra nəticəni geri anbara yığır və parçasını məlumat bazasında emal olunmuş kimi işarələyir. Bütün parçaları emal etdikdən sonra, Tcoder növbəti komponent üçün nəticələrin yaradılması tapşırığını göndərir.
- Combiner nəticələri bir araya gətirir: Tcoder tərəfindən hazırlanmış bütün parçaları yükləyir və müxtəlif dəqiqliklər üçün axınlar formalaşdırır.
Səs haqqında bir neçə söz. Ən populyar audio kodeklərdən biri olan AAC-nın mədəni bir xüsusiyyəti var. Əgər parçaları ayrı-ayrılıqda kodlayarsan, onları seamless birləşdirmək mümkün olmayacaq. Keçidlər diqqət çəkəcək. Video kodeklərində belə bir problem yoxdur. Teorik cəhətdən mürəkkəb texniki həll axtara bilərik, amma bu oyun sadəcə buna dəyər (audio video ilə müqayisədə əhəmiyyətində daha az yer tutur). Bu səbəbdən, videonun kodlanması paralel olaraq yerinə yetirilir, audio isə tamamilə emal edilir.
Nəticələr
Videonun paralel emalı sayəsində, videonu sistemə yüklədikdən sonra istifadəçilər üçün əlçatan olmaq arasında gecikməni əhəmiyyətli dərəcədə azaldıq. Məsələn, daha əvvəl bir buçuk saatlıq FullHD film üçün müxtəlif keyfiyyətləri olan bir neçə tam versiyanın yaradılması iki saat çəkə bilərdi. İndi bu iş 15 dəqiqə çəkir. Daha da irəliləyərək, paralel emal zamanı daha yüksək dəqiqlikli versiyanı, köhnə yanaşma ilə aşağı dəqiqliqli versiyadan daha tez yaradırıq.
Və hələ bir şey. Köhnə yanaşmada ya serverlər çatmadı, ya da onlar tapsız işlərlə boş qaldı. Paralel kodlama, avadanlıqların istifadə nisbətini artırmağa imkan verir. İndi minlərlə serverdən ibarət klasterimiz həmişə nəsə ilə məşğuldur.
Həqiqətən də hələ də irəliləyə biləcəyimiz yerlər var. Məsələn, video bizə tamamilə gəlməmişdən əvvəl parçaları emal etməyə başlasaq, zamanı əhəmiyyətli dərəcədə qazana bilərik. Dedikləri kimi, daha irəlidə daha çox şey var.
Şərhlərdə video işləri sahəsində hansı məsələlər haqqında oxumaq istədiyinizi yazın.
Sənaye mütəxəssislərinin təcrübəsinə faydalı linklər
Mənbə: habr.com
