Како го забрзавме кодирањето видео за осум пати

Како го забрзавме кодирањето видео за осум пати

Секој ден, милиони гледачи гледаат видеа на Интернет. Но, за видеото да стане достапно, не само што мора да се постави на серверот, туку и да се обработи. Колку побрзо се случи ова, толку подобро за услугата и нејзините корисници.

Јас се викам Аскар Камалов, пред една година се приклучив на тимот за видео технологија Yandex. Денеска накратко ќе им кажам на читателите на Habr за тоа како, со паралелизирање на процесот на кодирање, успеавме значително да ја забрзаме испораката на видео до корисникот.

Овој пост првенствено ќе биде од интерес за оние кои претходно не размислувале што се случува под капакот на видео услугите. Во коментарите можете да поставувате прашања и да предлагате теми за идни објави.

Неколку зборови за самата задача. Yandex не само што ви помага да пребарувате видеа на други сајтови, туку и да складира видеа за свои услуги. Без разлика дали станува збор за оригинална програма или спортски натпревар во етер, филм на KinoPoisk или видеа на Зен и Вести - сето ова е поставено на нашите сервери. За да можат корисниците да го гледаат видеото, тоа треба да се подготви: да се конвертира во потребниот формат, да се создаде преглед или дури и да се изврши преку технологијата DeepHD. Неподготвена датотека само зафаќа простор. Згора на тоа, не зборуваме само за оптимално користење на хардверот, туку и за брзината на испорака на содржината до корисниците. Пример: снимката од одлучувачкиот момент на хокеј натпревар може да се бара во рок од една минута по самиот настан.

Секвенцијално кодирање

Значи, среќата на корисникот во голема мера зависи од тоа колку брзо видеото ќе стане достапно. И ова главно се одредува со брзината на транскодирање. Кога нема строги барања за брзина на прикачување на видеото, тогаш нема проблеми. Земате единствена, неделива датотека, ја конвертирате и ја поставувате. На почетокот на нашето патување, вака работевме:

Како го забрзавме кодирањето видео за осум пати

Клиентот го поставува видеото во складиштето, компонентата Анализатор собира мета информации и го пренесува видеото во компонентата Worker за конверзија. Сите фази се изведуваат последователно. Во овој случај, може да има многу сервери за кодирање, но само еден е зафатен со обработка на одредено видео. Едноставен, транспарентен дијаграм. Тука завршуваат неговите предности. Оваа шема може да се скалира само вертикално (поради купувањето на помоќни сервери).

Секвенцијално кодирање со среден резултат

За некако да се изедначи болното чекање, индустријата излезе со опција за брзо кодирање. Името е погрешно, бидејќи всушност, целосното кодирање се случува последователно и трае исто толку долго. Но, со среден резултат. Идејата е следна: подгответе и објавите верзија на видеото со ниска резолуција што е можно побрзо, а дури потоа верзии со повисока резолуција.

Од една страна, видеото станува достапно побрзо. И тоа е корисно за важни настани. Но, од друга страна, сликата излегува матна, а тоа ги нервира гледачите.

Излегува дека не само што треба брзо да го обработите видеото, туку и да го одржите неговиот квалитет. Ова е она што корисниците го очекуваат сега од видео услугата. Можеби изгледа дека е доволно да се купат најпродуктивните сервери (и редовно да се надградуваат сите одеднаш). Но, ова е ќорсокак, бидејќи секогаш постои видео кое ќе го натера и најмоќниот хардвер да го забави.

Паралелно кодирање

Многу поефикасно е сложениот проблем да се подели на многу помалку сложени и да се решаваат паралелно на различни сервери. Ова е MapReduce за видео. Во овој случај, ние не сме ограничени од перформансите на еден сервер и можеме да скалираме хоризонтално (со додавање на нови машини).

Патем, идејата за поделба на видеата на мали парчиња, нивна паралелна обработка и лепење не е некоја тајна. Можете да најдете многу референци за овој пристап (на пример, на Habré препорачувам објава за проектот DistVIDc). Но, ова не го олеснува воопшто, бидејќи не можете само да земете готово решение и да го вградите во вашиот дом. Ни треба адаптација на нашата инфраструктура, нашето видео, па дури и нашиот товар. Во принцип, полесно е да напишете свое.

Така, во новата архитектура, монолитниот Работнички блок со секвенцијално кодирање го поделивме на микросервиси Segmenter, Tcoder, Combiner.

Како го забрзавме кодирањето видео за осум пати

  1. Segmenter го дели видеото на фрагменти од приближно 10 секунди. Фрагментите се состојат од еден или повеќе GOP (група слики). Секој GOP е независен и е кодиран посебно за да може да се дешифрира без повикување на рамки од други GOP. Тоа е, фрагментите може да се играат независно еден од друг. Ова распарчување ја намалува латентноста, што овозможува обработката да започне порано.
  2. Tcoder го обработува секој фрагмент. Зема задача од редот, презема фрагмент од складиштето, го шифрира во различни резолуции (запомнете дека плеерот може да избере верзија врз основа на брзината на поврзувањето), потоа го враќа резултатот во складиштето и го означува фрагментот како обработен во базата на податоци. Откако ги обработил сите фрагменти, Tcoder испраќа задача да генерира резултати за следната компонента.
  3. Combiner ги собира резултатите заедно: ги презема сите фрагменти направени од Tcoder, генерира преноси за различни резолуции.

Неколку зборови за звукот. Најпопуларниот аудио кодек AAC има непријатна карактеристика. Ако шифрирате фрагменти одделно, тогаш едноставно нема да можете беспрекорно да ги залепите заедно. Транзициите ќе бидат забележливи. Видео кодеците го немаат овој проблем. Теоретски, можете да барате сложено техничко решение, но оваа игра едноставно сè уште не вреди за свеќата (аудиото тежи значително помалку од видеото). Затоа, само видеото се кодира паралелно, а целата аудио трака се обработува.

Наоди

Благодарение на паралелната обработка на видеото, значително го намаливме доцнењето помеѓу видеото што ни се прикачува и е достапно за корисниците. На пример, претходно можеше да потрае два часа за да се создадат неколку целосни верзии со различен квалитет за FullHD филм кој трае час и половина. Сега сето ова трае 15 минути. Покрај тоа, со паралелна обработка, создаваме верзија со висока резолуција дури и побрзо од верзијата со ниска резолуција со стариот пристап со среден резултат.

И уште нешто. Со стариот пристап, или немаше доволно сервери, или беа неактивен без задачи. Паралелното кодирање ви овозможува да го зголемите уделот на рециклирање на железо. Сега нашиот кластер од повеќе од илјада сервери е секогаш зафатен со нешто.

Всушност, сè уште има простор за подобрување. На пример, можеме да заштедиме значително време ако почнеме да обработуваме фрагменти од видеото пред да ни пристигне во целост. Како што велат, следува уште повеќе.

Напишете во коментар за какви задачи од областа на работа со видео би сакале да прочитате.

Корисни врски до искуството на колегите од индустријата

Извор: www.habr.com

Додадете коментар