Біз бейне кодтауды сегіз есе жылдамдаттық

Біз бейне кодтауды сегіз есе жылдамдаттық

Күн сайын миллиондаған көрермендер Интернетте бейнелерді көреді. Бірақ бейне қолжетімді болуы үшін оны серверге жүктеп қана қоймай, өңдеу керек. Бұл неғұрлым жылдам болса, қызмет пен оның пайдаланушылары үшін соғұрлым жақсы болады.

Менің атым Камалов Асқар, бір жыл бұрын Яндекс видеотехнологиялар тобына қосылдым. Бүгін мен Habr оқырмандарына кодтау процесін параллельдеу арқылы пайдаланушыға бейнені жеткізуді айтарлықтай жылдамдатқанымыз туралы қысқаша айтып беремін.

Бұл пост, ең алдымен, бейне қызметтерінің қақпағы астында не болатыны туралы бұрын ойланбағандар үшін қызықты болады. Түсініктемелерде сұрақтар қойып, болашақ жазбаларға тақырыптар ұсына аласыз.

Тапсырманың өзі туралы бірнеше сөз. Яндекс басқа сайттарда бейнелерді іздеуге көмектесіп қана қоймайды, сонымен қатар бейнелерді өзінің қызметтері үшін сақтайды. Түпнұсқа бағдарлама немесе эфирдегі спорттық матч, KinoPoisk-тегі фильм немесе Zen және News-тегі бейнелер - мұның бәрі серверлерімізге жүктеледі. Пайдаланушылар бейнені көру үшін оны дайындау керек: қажетті форматқа түрлендіру, алдын ала қарауды жасау немесе тіпті технология арқылы іске қосу DeepHD. Дайын емес файл жай ғана орын алады. Оның үстіне, біз тек аппараттық құралдарды оңтайлы пайдалану туралы ғана емес, сонымен қатар мазмұнды пайдаланушыларға жеткізу жылдамдығы туралы айтып отырмыз. Мысал: хоккей матчының шешуші сәтінің жазбасын оқиғаның өзінен кейін бір минут ішінде іздеуге болады.

Тізбекті кодтау

Сонымен, пайдаланушының бақыты көбінесе бейненің қаншалықты тез қол жетімді болуына байланысты. Және бұл негізінен қайта кодтау жылдамдығымен анықталады. Бейнені жүктеу жылдамдығына қатаң талаптар болмаған кезде, ешқандай проблемалар болмайды. Сіз бір, бөлінбейтін файлды алып, оны түрлендіріңіз және жүктеңіз. Саяхатымыздың басында біз осылай жұмыс істедік:

Біз бейне кодтауды сегіз есе жылдамдаттық

Клиент бейнені жадқа жүктейді, Analyzer компоненті мета ақпаратты жинайды және түрлендіру үшін бейнені Worker компонентіне тасымалдайды. Барлық кезеңдер дәйекті түрде орындалады. Бұл жағдайда көптеген кодтау серверлері болуы мүмкін, бірақ тек біреуі ғана белгілі бір бейнені өңдеумен айналысады. Қарапайым, мөлдір диаграмма. Оның артықшылықтары осымен аяқталады. Бұл схеманы тек тігінен масштабтауға болады (қуаттырақ серверлерді сатып алуға байланысты).

Аралық нәтижемен дәйекті кодтау

Күтуді жеңілдету үшін сала жылдам кодтау нұсқасын ұсынды. Атауы жаңылыс, өйткені шын мәнінде, толық кодтау дәйекті түрде жүреді және дәл солай ұзақ уақыт алады. Бірақ аралық нәтижемен. Идея мынада: бейненің ажыратымдылығы төмен нұсқасын мүмкіндігінше тез дайындап, жариялау, содан кейін ғана жоғарырақ нұсқаларды.

Бір жағынан, бейне тезірек қолжетімді болады. Және бұл маңызды оқиғалар үшін пайдалы. Бірақ екінші жағынан, сурет бұлыңғыр болып шығады және бұл көрермендерді тітіркендіреді.

Бейнежазбаны жылдам өңдеп қана қоймай, оның сапасын да сақтау керек екен. Бұл қазір пайдаланушылардың бейне қызметінен күтетіні. Ең өнімді серверлерді сатып алу (және олардың барлығын бір уақытта үнемі жаңартып отыру) жеткілікті болып көрінуі мүмкін. Бірақ бұл тығырыққа тіреледі, өйткені әрқашан ең қуатты аппараттық құралды баяулататын бейне бар.

Параллельді кодтау

Күрделі есепті көптеген күрделілігі азырақ есептерге бөліп, оларды әртүрлі серверлерде параллельді түрде шешу әлдеқайда тиімді. Бұл бейнеге арналған MapReduce. Бұл жағдайда біз бір сервердің өнімділігімен шектелмейміз және көлденеңінен масштабтай аламыз (жаңа машиналарды қосу арқылы).

Айтпақшы, бейнелерді кішкене бөліктерге бөлу, оларды параллель өңдеу және оларды желімдеу идеясы құпия емес. Сіз бұл тәсілге көптеген сілтемелерді таба аласыз (мысалы, Habré сайтында мен жоба туралы жазбаны ұсынамын DistVIDc). Бірақ бұл жалпы жағдайды жеңілдетпейді, өйткені сіз жай ғана дайын шешімді алып, оны үйіңізге салуға болмайды. Бізге инфрақұрылымға, бейнеге және тіпті жүктемеге бейімделу керек. Жалпы, өз бетінше жазу оңайырақ.

Сонымен, жаңа архитектурада біз бірізді кодтаумен монолитті Worker блогын Segmenter, Tcoder, Combiner микросервистеріне бөлдік.

Біз бейне кодтауды сегіз есе жылдамдаттық

  1. Segmenter бейнені шамамен 10 секундтық фрагменттерге бөледі. Фрагменттер бір немесе бірнеше GOP-дан тұрады (суреттер тобы). Әрбір GOP тәуелсіз және бөлек кодталған, сондықтан оны басқа GOP кадрларына сілтемесіз дешифрлеуге болады. Яғни, фрагменттерді бір-бірінен тәуелсіз ойнауға болады. Бұл бөлшектеу кідірісті азайтып, өңдеуді ертерек бастауға мүмкіндік береді.
  2. Tcoder әрбір фрагментті өңдейді. Ол кезектен тапсырманы алады, жадтан фрагментті жүктейді, оны әртүрлі ажыратымдылыққа кодтайды (ойнатқыш қосылу жылдамдығына байланысты нұсқаны таңдай алатынын есте сақтаңыз), содан кейін нәтижені қайтадан жадқа қояды және фрагментті өңделген деп белгілейді деректер базасында. Барлық фрагменттерді өңдегеннен кейін, Tcoder келесі компонент үшін нәтижелерді жасау үшін тапсырманы жібереді.
  3. Комбинатор нәтижелерді бірге жинайды: Tcoder жасаған барлық фрагменттерді жүктеп алады, әртүрлі ажыратымдылықтар үшін ағындарды жасайды.

Дыбыс туралы бірнеше сөз. Ең танымал AAC аудио кодекінде жағымсыз мүмкіндік бар. Фрагменттерді бөлек кодтасаңыз, оларды біркелкі желімдей алмайсыз. Ауысулар айтарлықтай болады. Бейне кодектерінде бұл мәселе жоқ. Теориялық тұрғыдан күрделі техникалық шешімді іздеуге болады, бірақ бұл ойын әлі шамға тұрарлық емес (аудионың салмағы бейнеге қарағанда айтарлықтай аз). Сондықтан тек бейне параллель кодталады және бүкіл аудио трек өңделеді.

нәтижелері

Бейнені параллельді өңдеудің арқасында бейненің бізге жүктеп салынуы мен пайдаланушыларға қолжетімді болуы арасындағы кідірісті айтарлықтай азайттық. Мысалы, бұрын бір жарым сағатқа созылатын FullHD фильмі үшін әртүрлі сапада бірнеше толық нұсқасын жасауға екі сағат кетуі мүмкін еді. Енді мұның барлығы 15 минутты алады. Сонымен қатар, параллельді өңдеу арқылы біз ескі аралық нәтиже әдісімен төмен ажыратымдылықтағы нұсқаға қарағанда жоғары ажыратымдылықтағы нұсқаны жасаймыз.

Және тағы бір нәрсе. Ескі тәсілмен серверлер жеткіліксіз болды, немесе олар тапсырмаларсыз бос болды. Параллельді кодтау темірді қайта өңдеу үлесін арттыруға мүмкіндік береді. Қазір мыңнан астам серверлерден тұратын кластеріміз әрқашан бір нәрсемен айналысады.

Шындығында, әлі де жетілдіретін жерлер бар. Мысалы, бейненің үзінділерін ол бізге толық жеткенге дейін өңдеуді бастасақ, біз айтарлықтай уақытты үнемдей аламыз. Олар айтқандай, әлі алда.

Түсініктемелерде бейнемен жұмыс жасау саласындағы қандай тапсырмалар туралы оқығыңыз келетінін жазыңыз.

Салалық әріптестердің тәжірибесіне пайдалы сілтемелер

Ақпарат көзі: www.habr.com

пікір қалдыру