Qanday qilib biz video kodlashni sakkiz marta tezlashtirdik

Qanday qilib biz video kodlashni sakkiz marta tezlashtirdik

Har kuni millionlab tomoshabinlar Internetda videolarni tomosha qilishadi. Ammo video mavjud bo'lishi uchun u nafaqat serverga yuklanishi, balki qayta ishlanishi kerak. Bu qanchalik tez sodir bo'lsa, xizmat va uning foydalanuvchilari uchun shunchalik yaxshi bo'ladi.

Mening ismim Asqar Kamolov, bir yil oldin men Yandex video texnologiya jamoasiga qo'shilganman. Bugun men Habr o'quvchilariga kodlash jarayonini parallellashtirish orqali biz foydalanuvchiga videoni etkazib berishni sezilarli darajada tezlashtirishga muvaffaq bo'lganimiz haqida qisqacha aytib beraman.

Ushbu post, birinchi navbatda, video xizmatlarining qopqog'i ostida nima sodir bo'lishi haqida oldindan o'ylamaganlar uchun qiziqarli bo'ladi. Izohlarda siz savollar berishingiz va kelgusi postlar uchun mavzularni taklif qilishingiz mumkin.

Vazifaning o'zi haqida bir necha so'z. Yandex nafaqat boshqa saytlarda videolarni qidirishga yordam beradi, balki o'z xizmatlari uchun videolarni saqlaydi. Bu original dastur yoki efirdagi sport musobaqasi, KinoPoisk-dagi film yoki Zen va News-dagi videolar bo'ladimi - bularning barchasi bizning serverlarimizga yuklanadi. Foydalanuvchilar videoni tomosha qilishlari uchun uni tayyorlash kerak: kerakli formatga o'tkazish, oldindan ko'rishni yaratish yoki hatto texnologiyadan foydalanish DeepHD. Tayyorlanmagan fayl shunchaki joy egallaydi. Bundan tashqari, biz nafaqat apparat vositalaridan optimal foydalanish, balki kontentni foydalanuvchilarga etkazish tezligi haqida ham gapiramiz. Misol: xokkey o'yinining hal qiluvchi lahzasining yozuvini voqeaning o'zidan keyin bir daqiqa ichida qidirish mumkin.

Ketma-ket kodlash

Shunday qilib, foydalanuvchining baxti ko'p jihatdan video qanchalik tez mavjud bo'lishiga bog'liq. Va bu asosan transkod tezligi bilan belgilanadi. Video yuklash tezligi uchun qat'iy talablar bo'lmasa, unda hech qanday muammo bo'lmaydi. Siz bitta, bo'linmas faylni olasiz, uni aylantirasiz va yuklaysiz. Sayohatimizning boshida biz shunday ishladik:

Qanday qilib biz video kodlashni sakkiz marta tezlashtirdik

Mijoz videoni saqlashga yuklaydi, Analyzer komponenti meta-ma'lumotni to'playdi va videoni konvertatsiya qilish uchun Ishchi komponentiga o'tkazadi. Barcha bosqichlar ketma-ket amalga oshiriladi. Bunday holda, ko'plab kodlash serverlari bo'lishi mumkin, ammo faqat bittasi ma'lum bir videoni qayta ishlash bilan band. Oddiy, shaffof diagramma. Bu erda uning afzalliklari tugaydi. Ushbu sxema faqat vertikal ravishda kengaytirilishi mumkin (kuchliroq serverlarni sotib olish tufayli).

Oraliq natija bilan ketma-ket kodlash

Og'riqli kutishni qandaydir tarzda yumshatish uchun sanoat tez kodlash variantini taklif qildi. Ism noto'g'ri, chunki aslida to'liq kodlash ketma-ket sodir bo'ladi va xuddi shunday uzoq davom etadi. Ammo oraliq natija bilan. G'oya shunday: videoning past aniqlikdagi versiyasini imkon qadar tezroq tayyorlang va nashr eting va shundan keyingina yuqoriroq aniqlikdagi versiyalarni tayyorlang.

Bir tomondan, video tezroq mavjud bo'ladi. Va bu muhim voqealar uchun foydalidir. Ammo boshqa tomondan, rasm loyqa bo'lib chiqadi va bu tomoshabinlarni bezovta qiladi.

Ma'lum bo'lishicha, siz nafaqat videoni tezda qayta ishlashingiz, balki uning sifatini ham saqlab qolishingiz kerak. Hozirda foydalanuvchilar videoxizmatdan shuni kutishmoqda. Ko'rinishidan, eng samarali serverlarni sotib olish (va ularni bir vaqtning o'zida muntazam ravishda yangilash) etarli. Ammo bu boshi berk ko'chadir, chunki har doim eng kuchli uskunani ham sekinlashtiradigan video bor.

Parallel kodlash

Murakkab masalani ko'plab kamroq murakkab bo'lganlarga bo'lish va ularni turli serverlarda parallel ravishda hal qilish ancha samaralidir. Bu video uchun MapReduce. Bunday holda, biz bitta serverning ishlashi bilan cheklanmaymiz va gorizontal ravishda o'lchashimiz mumkin (yangi mashinalarni qo'shish orqali).

Aytgancha, videolarni kichik qismlarga bo'lish, ularni parallel ravishda qayta ishlash va ularni bir-biriga yopishtirish g'oyasi sir emas. Siz ushbu yondashuvga juda ko'p havolalarni topishingiz mumkin (masalan, HabrΓ©-da men loyiha haqida postni tavsiya qilaman DistVIDc). Ammo bu umuman osonlashtirmaydi, chunki siz shunchaki tayyor echimni olib, uni uyingizga qurishingiz mumkin emas. Biz infratuzilmamizga, videomizga va hatto yukimizga moslashishimiz kerak. Umuman olganda, o'zingizni yozish osonroq.

Shunday qilib, yangi arxitekturada biz ketma-ket kodlash bilan monolit Worker blokini Segmenter, Tcoder, Combiner mikroservislariga ajratdik.

Qanday qilib biz video kodlashni sakkiz marta tezlashtirdik

  1. Segmenter videoni taxminan 10 soniyalik qismlarga ajratadi. Fragmentlar bir yoki bir nechta GOP dan iborat (rasmlar guruhi). Har bir GOP mustaqil va alohida kodlangan, shuning uchun uni boshqa GOP freymlariga murojaat qilmasdan dekodlash mumkin. Ya'ni, fragmentlar bir-biridan mustaqil ravishda ijro etilishi mumkin. Ushbu parchalanish kechikishni kamaytiradi, bu esa qayta ishlashni erta boshlash imkonini beradi.
  2. Tcoder har bir fragmentni qayta ishlaydi. U navbatdan vazifani oladi, xotiradan fragmentni yuklab oladi, uni turli ruxsatlarga kodlaydi (esda tutingki, pleer ulanish tezligiga qarab versiyani tanlashi mumkin), so'ng natijani yana xotiraga qo'yadi va parchani qayta ishlangan deb belgilaydi. ma'lumotlar bazasida. Barcha fragmentlarni qayta ishlagandan so'ng, Tcoder keyingi komponent uchun natijalarni yaratish uchun vazifani yuboradi.
  3. Birlashtiruvchi natijalarni birgalikda to'playdi: Tcoder tomonidan yaratilgan barcha fragmentlarni yuklab oladi, turli ruxsatlar uchun oqimlarni yaratadi.

Ovoz haqida bir necha so'z. Eng mashhur AAC audio kodek noxush xususiyatga ega. Agar siz parchalarni alohida kodlasangiz, ularni bir-biriga muammosiz yopishtira olmaysiz. O'tishlar sezilarli bo'ladi. Video kodeklarida bunday muammo yo'q. Nazariy jihatdan, siz murakkab texnik echimni izlashingiz mumkin, ammo bu o'yin hali shamga arzimaydi (audio videoga qaraganda sezilarli darajada kamroq). Shuning uchun, faqat video parallel ravishda kodlanadi va butun audio trek qayta ishlanadi.

Natijalar

Videoni parallel qayta ishlash tufayli biz videoning bizga yuklanishi va foydalanuvchilar uchun ochiq boβ€˜lishi oβ€˜rtasidagi kechikishni sezilarli darajada kamaytirdik. Misol uchun, ilgari bir yarim soat davom etadigan FullHD filmi uchun turli xil sifatdagi bir nechta to'liq versiyalarni yaratish uchun ikki soat vaqt ketishi mumkin edi. Endi bularning barchasi 15 daqiqa davom etadi. Bundan tashqari, parallel ishlov berish bilan biz eski oraliq natija yondashuvi bilan past aniqlikdagi versiyadan ham tezroq yuqori aniqlikdagi versiyani yaratamiz.

Va yana bir narsa. Eski yondashuv bilan yoki serverlar etarli emas edi yoki ular vazifalarsiz ishlamay qoldi. Parallel kodlash temirni qayta ishlash ulushini oshirish imkonini beradi. Endi mingdan ortiq serverlardan iborat klasterimiz doimo nimadir bilan band.

Darhaqiqat, takomillashtirish uchun hali imkoniyatlar mavjud. Masalan, videoning parchalarini u bizga to'liq yetib borgunga qadar qayta ishlashni boshlasak, vaqtni sezilarli darajada tejashimiz mumkin. Ular aytganidek, yana ko'p.

Video bilan ishlash sohasida qanday vazifalar haqida o'qishni xohlayotganingizni izohlarda yozing.

Sanoat hamkasblarining tajribasiga foydali havolalar

Manba: www.habr.com

a Izoh qo'shish