Як мы паскорылі кадаваньне відэа ў восем разоў

Як мы паскорылі кадаваньне відэа ў восем разоў

Кожны дзень мільёны гледачоў глядзяць відэа ў інтэрнэце. Але каб відэа стала даступна, яго трэба не толькі загрузіць на сервер, але і апрацаваць. Чым хутчэй гэта адбываецца - тым лепш сэрвісу і яго карыстальнікам.

Мяне клічуць Аскар Камалаў, год таму я далучыўся да каманды відэатэхналогій Яндэкса. Сёння я сцісла распавяду чытачам Хабра аб тым, як з дапамогай распаралельвання працэсу кадавання нам атрымалася ў разы паскорыць дастаўку відэа да карыстача.

Гэты пост у першую чаргу будзе цікавы тым, хто раней не задумваўся аб тым, што адбываецца пад капотам відэасэрвісаў. У каментарах можна задаваць пытанні і прапаноўваць тэмы для будучых пастоў.

Некалькі слоў аб самой задачы. Яндэкс не толькі дапамагае шукаць відэа на іншых сайтах, але і захоўвае відэа для ўласных сэрвісаў. Будзь то аўтарская праграма або спартыўны матч у Эфіры, фільм на КінаПошуку або ролікі ў Дзене і Навінах - усё гэта загружаецца на нашы серверы. Каб карыстачы паглядзелі відэа, яго трэба падрыхтаваць: сканвертаваць у неабходны фармат, стварыць превьюшку ці нават прагнаць праз тэхналогію DeepHD. Непадрыхтаваны файл проста займае месца. Прычым гаворка ідзе не толькі аб аптымальным выкарыстанні жалеза, але і аб хуткасці дастаўкі кантэнту да карыстальнікаў. Прыклад: запіс з вырашальным момантам хакейнага матча могуць шукаць у пошуку ўжо праз хвіліну пасля самой падзеі.

Паслядоўнае кадаваньне

Такім чынам, шчасце карыстальніка шмат у чым залежыць ад таго, як хутка відэа стане даступна. А гэта ў асноўным вызначаецца хуткасцю транскадавання. Калі цвёрдых патрабаванняў да хуткасці выкладкі відэа няма, то і праблем няма. Бярэце адзіны, непадзельны файл, канвертуеце яго, выкладваеце. На пачатку свайго шляху мы так і працавалі:

Як мы паскорылі кадаваньне відэа ў восем разоў

Кліент загружае відэа ў сховішча, кампанент Analyzer збірае метаінфармацыю і перадае відэа на канвертаванне ў кампанент Worker. Усе этапы выконваюцца паслядоўна. Пры гэтым сервераў для кадавання можа быць шмат, але толькі адзін заняты апрацоўкай канкрэтнага відэа. Простая, празрыстая схема. На гэтым яе добрыя якасці і сканчаюцца. Такая схема маштабуецца толькі вертыкальна (за кошт пакупкі больш магутных сервераў).

Паслядоўнае кадаваньне з прамежкавым вынікам

Каб хоць неяк згладзіць пакутлівае чаканне, у індустрыі прыдумалі варыянт хуткага кадавання. Падманлівая назва, таму што на самой справе паўнавартаснае кадаваньне адбываецца паслядоўна і гэтак жа доўга. Але затое з прамежкавым вынікам. Ідэя такая: як мага хутчэй падрыхтаваць і выкласці версію відэа ў нізкім дазволе, а ўжо потым - версіі больш высокіх дазволаў.

З аднаго боку, відэа становіцца даступна хутчэй. І гэта карысна для важных падзеяў. Але з другога - карцінка атрымліваецца размытая, а гэта раздражняе гледачоў.

Атрымліваецца, трэба не толькі хутка апрацоўваць відэа, але і захоўваць яго якасць. Гэта тое, чаго чакаюць ад відэасэрвісу карыстальнікі зараз. Можа здацца, што досыць купіць найболей прадукцыйныя серверы (і рэгулярна зараз іх усё апгрэйдзіць). Але гэта шлях у тупік, таму што заўсёды знойдзецца відэа, якое прымусіць тармазіць нават самае магутнае жалеза.

Паралельнае кадаваньне

Куды больш эфектыўна падзяліць складаную задачу на мноства менш складаных і паралельна іх вырашаць на розных серверах. Такі вось MapReduce для відэа. У гэтым выпадку мы не ўпіраемся ў прадукцыйнасць аднаго сервера і можам маштабавацца гарызантальна (за кошт дадання новых машын).

Дарэчы, ідэя драбіць відэа на дробныя кавалкі, паралельна апрацоўваць і склейваць іх - не нейкі сакрэт. Вы можаце знайсці мноства згадак гэтага падыходу (напрыклад, на Хабры рэкамендую пост аб праекце DistVIDc). Але ад гэтага ў цэлым не становіцца лягчэй, бо нельга проста так узяць ужо гатовае рашэнне і ўбудаваць да сябе. Патрэбна адаптацыя пад нашу інфраструктуру, наша відэа і нават нашу нагрузку. Увогуле, прасцей напісаць сваё.

Такім чынам, у новай архітэктуры маналітны блок Worker c паслядоўным кадаваннем мы падзялілі на мікрасэрвісы Segmenter, Tcoder, Combiner.

Як мы паскорылі кадаваньне відэа ў восем разоў

  1. Segmenter разбівае відэа на фрагменты прыкладна па 10 секунд. Фрагменты складаюцца з адной або некалькіх GOP (group of pictures). Кожная GOP незалежна і кадуецца асобна, так што можа быць дэкадаваная без спасылкі на кадры з іншых GOP. Гэта значыць фрагменты могуць прайгравацца незалежна сябар ад сябра. Такое сегментаванне памяншае затрымку, дазваляючы пачаць апрацоўку раней.
  2. Tcoder апрацоўвае кожны фрагмент. Ён бярэ заданне з чаргі, спампоўвае фрагмент са сховішча, кадуе ў розныя дазволы (нагадаем, што плэер можа выбіраць версію, зыходзячы са хуткасці злучэння), затым складае вынік зваротна ў сховішча і пазначае фрагмент апрацаваным у базе дадзеных. Апрацаваўшы ўсе фрагменты, Tcoder адпраўляе задачу на фармаванне вынікаў для наступнага кампанента.
  3. Сombiner збірае вынікі разам: спампоўвае ўсе фрагменты, зробленыя Tcoder, фармуе струмені для розных дазволаў.

Некалькі слоў аб гуку. У найболей папулярнага аўдыёкодэка AAC ёсць непрыемная асаблівасць. Калі кадзіраваць фрагменты асобна, то склеіць іх бясшвоўна проста не атрымаецца. Пераходы будуць заўважныя. У відэакодэкаў такой праблемы няма. Тэарэтычна можна пашукаць складанае тэхнічнае рашэнне, але гэтая гульня пакуль што проста не варта свечак (аўдыё важыць істотна менш, чым відэа). Таму ў нас паралельна кадуецца толькі відэа, а аўдыёдарожка апрацоўваецца цалкам.

Вынікі

Дзякуючы раўналежнай апрацоўцы відэа мы значна скарацілі затрымку паміж загрузкай відэа да нас і яго даступнасцю для карыстачоў. Напрыклад, раней на стварэнне некалькіх паўнавартасных версій рознай якасці для FullHD-фільма працягласцю паўтары гадзіны магло сысці дзве гадзіны. Цяпер усё гэта займае 15 хвілін. Больш таго, пры раўналежнай апрацоўцы мы ствараем версію ў высокім дазволе нават хутчэй, чым версію ў нізкім дазволе пры старым падыходзе з прамежкавым вынікам.

І яшчэ сёе-тое. Пры старым падыходзе або магло не хапаць сервераў, або яны прастойвалі без задач. Раўналежнае кадаваньне дазваляе падвысіць дзель утылізацыі жалеза. Зараз наш кластар больш за з тысячы сервераў увесь час чымсьці заняты.

Насамрэч яшчэ ёсць куды імкнуцца. Напрыклад, мы можам істотна зэканоміць час, калі пачнем апрацоўваць фрагменты відэа яшчэ да таго, як яно да нас паступіла поўнасцю. Як гаворыцца, далей - больш.

Напішыце ў каментарах, пра якія задачы ў галіне працы з відэа вы б хацелі прачытаць.

Карысныя спасылкі на досвед калег па індустрыі

Крыніца: habr.com

Дадаць каментар