Как ускорихме видео кодирането осем пъти

Как ускорихме видео кодирането осем пъти

Всеки ден милиони зрители гледат видеоклипове в интернет. Но за да стане видеото достъпно, то трябва не само да бъде качено на сървъра, но и обработено. Колкото по-бързо се случи това, толкова по-добре за услугата и нейните потребители.

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

Тази публикация ще представлява интерес предимно за тези, които преди това не са мислили какво се случва под капака на видео услугите. В коментарите можете да задавате въпроси и да предлагате теми за бъдещи публикации.

Няколко думи за самата задача. Yandex не само ви помага да търсите видеоклипове в други сайтове, но също така съхранява видеоклипове за собствените си услуги. Независимо дали става въпрос за оригинална програма или спортен мач в ефир, филм на KinoPoisk или видеоклипове на Zen и News - всичко това се качва на нашите сървъри. За да могат потребителите да гледат видеоклипа, той трябва да бъде подготвен: преобразуван в необходимия формат, създаден предварителен преглед или дори да премине през технология DeepHD. Неподготвен файл просто заема място. Освен това говорим не само за оптималното използване на хардуера, но и за скоростта на доставка на съдържание до потребителите. Пример: запис на решаващия момент от хокеен мач може да се търси в рамките на минута след самото събитие.

Последователно кодиране

Така че щастието на потребителя до голяма степен зависи от това колко бързо видеото става достъпно. И това се определя главно от скоростта на транскодиране. Когато няма строги изисквания за скорост на качване на видео, тогава няма проблеми. Взимате единичен неделим файл, конвертирате го и го качвате. В началото на нашето пътуване работихме по следния начин:

Как ускорихме видео кодирането осем пъти

Клиентът качва видеото в хранилището, компонентът Analyzer събира мета информация и прехвърля видеото към компонента Worker за преобразуване. Всички етапи се изпълняват последователно. В този случай може да има много сървъри за кодиране, но само един е зает с обработката на конкретно видео. Проста, прозрачна диаграма. Тук предимствата му свършват. Тази схема може да се мащабира само вертикално (поради закупуването на по-мощни сървъри).

Последователно кодиране с междинен резултат

За да изглади по някакъв начин болезненото чакане, индустрията излезе с опция за бързо кодиране. Името е подвеждащо, защото всъщност пълното кодиране се извършва последователно и отнема също толкова време. Но с междинен резултат. Идеята е следната: подгответе и публикувайте възможно най-бързо версия на видеото с ниска резолюция и едва след това версии с по-висока резолюция.

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

Оказва се, че трябва не само бързо да обработвате видеото, но и да поддържате неговото качество. Това е, което потребителите очакват от видео услуга сега. Може да изглежда, че е достатъчно да закупите най-производителните сървъри (и редовно да ги надграждате наведнъж). Но това е задънена улица, защото винаги има видео, което ще накара и най-мощния хардуер да се забави.

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

Много по-ефективно е да разделите сложен проблем на много по-малко сложни и да ги решавате паралелно на различни сървъри. Това е MapReduce за видео. В този случай ние не сме ограничени от производителността на един сървър и можем да мащабираме хоризонтално (чрез добавяне на нови машини).

Между другото, идеята за разделяне на видеоклипове на малки парчета, обработката им паралелно и залепването им не е някаква тайна. Можете да намерите много препратки към този подход (например на Habré препоръчвам публикация за проекта DistVIDc). Но това не го прави по-лесно като цяло, защото не можете просто да вземете готово решение и да го вградите в дома си. Имаме нужда от адаптиране към нашата инфраструктура, нашето видео и дори нашето натоварване. Като цяло е по-лесно да напишете свой собствен.

И така, в новата архитектура, ние разделихме монолитния работен блок с последователно кодиране на микроуслуги Segmenter, Tcoder, Combiner.

Как ускорихме видео кодирането осем пъти

  1. Сегментаторът разделя видеото на фрагменти от приблизително 10 секунди. Фрагментите се състоят от една или повече GOP (група от снимки). Всеки GOP е независим и се кодира отделно, така че да може да бъде декодиран без препратка към рамки от други GOP. Тоест фрагментите могат да се възпроизвеждат независимо един от друг. Това шардинг намалява латентността, позволявайки обработката да започне по-рано.
  2. Tcoder обработва всеки фрагмент. Той взема задача от опашката, изтегля фрагмент от хранилището, кодира го в различни резолюции (не забравяйте, че играчът може да избере версия въз основа на скоростта на връзката), след което връща резултата обратно в хранилището и маркира фрагмента като обработен в базата данни. След като обработи всички фрагменти, Tcoder изпраща задачата за генериране на резултати за следващия компонент.
  3. Combiner събира резултатите заедно: изтегля всички фрагменти, направени от Tcoder, генерира потоци за различни резолюции.

Няколко думи за звука. Най-популярният AAC аудио кодек има неприятна функция. Ако кодирате фрагменти отделно, тогава просто няма да можете да ги залепите безпроблемно. Преходите ще бъдат забележими. Видео кодеците нямат този проблем. Теоретично можете да търсите сложно техническо решение, но тази игра все още просто не си струва свещта (аудиото тежи значително по-малко от видеото). Следователно само видеото се кодира паралелно и се обработва целият аудио запис.

резултати

Благодарение на паралелната обработка на видео, ние намалихме значително забавянето между качването на видеоклипа при нас и достъпа му до потребителите. Например, преди това можеше да отнеме два часа, за да създадете няколко пълни версии с различно качество за FullHD филм с продължителност час и половина. Сега всичко това отнема 15 минути. Освен това, с паралелна обработка, ние създаваме версия с висока разделителна способност дори по-бързо от версия с ниска разделителна способност със стария подход за междинни резултати.

И още нещо. При стария подход или нямаше достатъчно сървъри, или бяха бездействащи без задачи. Паралелното кодиране ви позволява да увеличите дела на рециклирането на желязо. Сега нашият клъстер от повече от хиляда сървъра винаги е зает с нещо.

Всъщност все още има място за подобрение. Например, можем да спестим значително време, ако започнем да обработваме фрагменти от видеото, преди то да пристигне при нас в своята цялост. Както се казва, предстои още.

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

Полезни връзки към опита на колеги от индустрията

Източник: www.habr.com

Добавяне на нов коментар