Бид хэрхэн видео кодчиллыг XNUMX дахин хурдасгав

Бид хэрхэн видео кодчиллыг XNUMX дахин хурдасгав

Өдөр бүр сая сая үзэгчид интернетээр видео үздэг. Гэхдээ видеог ашиглах боломжтой болохын тулд зөвхөн серверт байршуулаад зогсохгүй боловсруулагдсан байх ёстой. Энэ нь хэдий чинээ хурдан явагдах тусам үйлчилгээ болон түүний хэрэглэгчдэд илүү сайн байх болно.

Намайг Аскар Камалов гэдэг, жилийн өмнө би Yandex видео технологийн багт элссэн. Өнөөдөр би Хабр уншигчдад кодчилолын процессыг зэрэгцүүлснээр бид видеог хэрэглэгчдэд хүргэх ажлыг хэрхэн хурдасгаж чадсан талаар товч ярих болно.

Энэ нийтлэл нь видео үйлчилгээний бүрээс дор юу болдог талаар урьд өмнө бодож байгаагүй хүмүүст сонирхолтой байх болно. Сэтгэгдэл дээр та асуулт асууж, цаашдын нийтлэлүүдийн сэдвийг санал болгож болно.

Даалгаврын талаар хэдэн үг хэлье. Yandex нь бусад сайтаас видео хайхад тусалдаг төдийгүй өөрийн үйлчилгээнд зориулж видеог хадгалдаг. Энэ нь анхны нэвтрүүлэг эсвэл спортын тэмцээн, KinoPoisk дээрх кино эсвэл Zen болон News дээрх видеонууд - энэ бүгдийг манай серверт байршуулдаг. Хэрэглэгчид видеог үзэхийн тулд үүнийг бэлтгэх шаардлагатай: шаардлагатай формат руу хөрвүүлэх, урьдчилан үзэх, эсвэл технологийн дагуу ажиллуулах. DeepHD. Бэлтгээгүй файл зүгээр л зай эзэлнэ. Түүгээр ч барахгүй бид зөвхөн техник хангамжийг оновчтой ашиглах талаар төдийгүй хэрэглэгчдэд контент хүргэх хурдны тухай ярьж байна. Жишээ нь: хоккейн тэмцээний шийдвэрлэх мөчийн бичлэгийг тухайн үйл явдлаас хойш нэг минутын дотор хайж болно.

Дараалсан кодчилол

Тиймээс хэрэглэгчийн аз жаргал нь видео хэр хурдан гарахаас ихээхэн хамаардаг. Энэ нь голчлон код хувиргах хурдаар тодорхойлогддог. Хэрэв видео байршуулах хурдад хатуу шаардлага байхгүй бол ямар ч асуудал гарахгүй. Та нэг хуваагдашгүй файлыг аваад хөрвүүлээд байршуулна. Аялалын эхэнд бид дараах байдлаар ажилласан.

Бид хэрхэн видео кодчиллыг XNUMX дахин хурдасгав

Үйлчлүүлэгч видеог хадгалах санд байршуулж, анализаторын бүрэлдэхүүн хэсэг нь мета мэдээллийг цуглуулж, хөрвүүлэхийн тулд видеог Worker бүрэлдэхүүн хэсэг рүү шилжүүлдэг. Бүх үе шатуудыг дараалан гүйцэтгэдэг. Энэ тохиолдолд олон кодчилол сервер байж болох ч зөвхөн нэг нь тодорхой видеог боловсруулах завгүй байдаг. Энгийн, ил тод диаграм. Энд л түүний давуу тал дуусдаг. Энэ схемийг зөвхөн босоо чиглэлд (илүү хүчирхэг сервер худалдаж авсны улмаас) өргөжүүлж болно.

Завсрын үр дүнтэй дараалсан кодчилол

Зовлонт хүлээлтийг ямар нэгэн байдлаар зөөлрүүлэхийн тулд салбар хурдан кодлох сонголтыг гаргаж ирэв. Нэр нь төөрөгдүүлсэн, учир нь үнэн хэрэгтээ бүрэн кодчилол нь дараалан хийгддэг бөгөөд яг л урт хугацаа шаарддаг. Гэхдээ дунд зэргийн үр дүнтэй. Гол санаа нь: видеоны бага нарийвчлалтай хувилбарыг аль болох хурдан бэлтгэж, нийтлэх, зөвхөн дараа нь илүү өндөр нарийвчлалтай хувилбаруудыг гаргах.

Нэг талаас, видео илүү хурдан байдаг. Мөн чухал үйл явдлуудад хэрэгтэй. Гэхдээ нөгөө талаар зураг нь бүдэг бадаг болж, үзэгчдийг бухимдуулдаг.

Та видеог хурдан боловсруулж зогсохгүй чанарыг нь хадгалах хэрэгтэй болж байна. Үүнийг одоо хэрэглэгчид видео үйлчилгээнээс хүлээж байгаа юм. Энэ нь хамгийн бүтээмжтэй серверүүдийг худалдаж авахад хангалттай юм шиг санагдаж магадгүй (мөн тэдгээрийг нэг дор тогтмол шинэчлэх). Гэхдээ энэ бол мухардалд орсон, учир нь хамгийн хүчирхэг техник хангамжийг хүртэл удаашруулах видео үргэлж байдаг.

Зэрэгцээ кодчилол

Нарийн төвөгтэй асуудлыг олон төвөгтэй багатай олон асуудалд хувааж, өөр өөр сервер дээр зэрэгцүүлэн шийдвэрлэх нь илүү үр дүнтэй байдаг. Энэ бол видеонд зориулсан MapReduce юм. Энэ тохиолдолд бид нэг серверийн гүйцэтгэлээр хязгаарлагдахгүй бөгөөд хэвтээ байдлаар (шинэ машин нэмэх замаар) масштаблах боломжтой.

Дашрамд хэлэхэд, видеог жижиг хэсгүүдэд хувааж, тэдгээрийг зэрэгцүүлэн боловсруулж, хооронд нь наах санаа нь нууц биш юм. Та энэ аргын талаар олон лавлагаа олж болно (жишээлбэл, Habré дээр би төслийн тухай нийтлэлийг санал болгож байна DistVIDc). Гэхдээ энэ нь ерөнхийдөө үүнийг хөнгөвчлөхгүй, учир нь та зүгээр л бэлэн шийдлийг аваад гэртээ барьж чадахгүй. Бид дэд бүтэц, видео, тэр ч байтугай ачаалалдаа дасан зохицох хэрэгтэй. Ерөнхийдөө өөрөө бичих нь илүү хялбар байдаг.

Тиймээс, шинэ архитектурт бид дараалсан кодчилол бүхий цул Worker блокыг Segmenter, Tcoder, Combiner микро үйлчилгээ болгон хуваасан.

Бид хэрхэн видео кодчиллыг XNUMX дахин хурдасгав

  1. Сегментер нь видеог ойролцоогоор 10 секундын хэсгүүдэд хуваадаг. Фрагментууд нь нэг буюу хэд хэдэн GOP-ээс бүрдэнэ (зурагны бүлэг). GOP бүр нь бие даасан бөгөөд тусад нь кодлогдсон тул бусад GOP-ийн фреймээс лавлагаагүйгээр тайлж болно. Өөрөөр хэлбэл, фрагментуудыг бие биенээсээ хамааралгүйгээр тоглож болно. Энэхүү хуваалт нь хоцролтыг багасгаж, боловсруулалтыг эрт эхлүүлэх боломжийг олгодог.
  2. Tcoder нь фрагмент бүрийг боловсруулдаг. Энэ нь дараалалаас даалгавар авч, хадгалах сангаас фрагмент татаж аваад, өөр өөр нарийвчлалтайгаар кодчилдог (тоглогч холболтын хурд дээр үндэслэн хувилбар сонгох боломжтой гэдгийг санаарай), дараа нь үр дүнг хадгалах сан руу буцааж, фрагментийг боловсруулсан гэж тэмдэглэнэ. мэдээллийн санд. Бүх фрагментуудыг боловсруулсны дараа Tcoder дараагийн бүрэлдэхүүн хэсгийн үр дүнг гаргах даалгаврыг илгээдэг.
  3. Комбинер нь үр дүнг цуглуулдаг: Tcoder-ийн хийсэн бүх фрагментуудыг татаж, өөр өөр нягтралд зориулж урсгал үүсгэдэг.

Дууны тухай хэдэн үг. Хамгийн алдартай AAC аудио кодлогч нь тааламжгүй шинж чанартай байдаг. Хэрэв та хэсгүүдийг тусад нь кодчилвол тэдгээрийг хооронд нь жигд нааж чадахгүй. Шилжилтүүд мэдэгдэхүйц байх болно. Видео кодлогчдод ийм асуудал гардаггүй. Онолын хувьд та нарийн төвөгтэй техникийн шийдлийг хайж болно, гэхдээ энэ тоглоом нь ердөө л лааны үнэ цэнэтэй биш юм (аудио нь видео бичлэгээс хамаагүй бага жинтэй). Тиймээс зөвхөн видео бичлэгийг зэрэгцүүлэн кодчилдог бөгөөд аудио бичлэгийг бүхэлд нь боловсруулдаг.

Результаты

Зэрэгцээ видео боловсруулалтын ачаар бид видеог бидэнд байршуулах болон хэрэглэгчдэд хүртээмжтэй байх хоорондын саатлыг эрс багасгасан. Жишээлбэл, өмнө нь нэг цаг хагасын үргэлжлэх FullHD киноны өөр өөр чанартай хэд хэдэн бүрэн хувилбарыг бүтээхэд хоёр цаг зарцуулдаг. Одоо энэ бүхэн 15 минут болно. Түүнчлэн, зэрэгцээ боловсруулалт хийснээр бид хуучин завсрын үр дүнгийн арга барилтай бага нарийвчлалтай хувилбараас ч илүү хурдан өндөр нарийвчлалтай хувилбарыг бий болгодог.

Бас нэг зүйл. Хуучин арга барилаар серверүүд хангалтгүй байсан, эсвэл даалгаваргүй сул зогсдог байсан. Зэрэгцээ кодчилол нь төмрийн дахин боловсруулалтын хувийг нэмэгдүүлэх боломжийг олгодог. Одоо мянга гаруй сервертэй манай кластер үргэлж ямар нэгэн зүйлд завгүй байдаг.

Ер нь сайжруулах зүйл байсаар л байна. Жишээлбэл, бид видеог бүхэлд нь бидэнд ирэхээс нь өмнө хэсэгчлэн боловсруулж эхэлбэл ихээхэн цаг хэмнэх боломжтой. Тэдний хэлснээр илүү их зүйл ирэх болно.

Видеотой ажиллах чиглэлээр ямар ажлуудын талаар уншихыг хүсч байгаагаа сэтгэгдэл дээр бичээрэй.

Салбарын хамт ажиллагсдын туршлагад хэрэгтэй холбоосууд

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх