Com hem accelerat la codificació de vídeo vuit vegades

Com hem accelerat la codificació de vídeo vuit vegades

Cada dia, milions d'espectadors veuen vídeos a Internet. Però perquè el vídeo estigui disponible, no només s'ha de penjar al servidor, sinó també processar-lo. Com més ràpid passi això, millor per al servei i els seus usuaris.

Em dic Askar Kamalov, fa un any em vaig incorporar a l'equip de tecnologia de vídeo Yandex. Avui explicaré breument als lectors Habr sobre com, en paral·lelitzar el procés de codificació, hem aconseguit accelerar significativament el lliurament de vídeo a l'usuari.

Aquesta publicació serà d'interès principal per a aquells que no hagin pensat anteriorment en què passa sota el capó dels serveis de vídeo. Als comentaris podeu fer preguntes i suggerir temes per a futures publicacions.

Unes paraules sobre la tasca en si. Yandex no només us ajuda a cercar vídeos en altres llocs, sinó que també emmagatzema vídeos per als seus propis serveis. Tant si es tracta d'un programa original com d'un partit esportiu en directe, una pel·lícula a KinoPoisk o vídeos a Zen and News, tot això es penja als nostres servidors. Perquè els usuaris vegin el vídeo, cal que estigui preparat: convertit al format requerit, creat una vista prèvia o fins i tot executar-lo mitjançant la tecnologia DeepHD. Un fitxer no preparat només ocupa espai. A més, estem parlant no només de l'ús òptim del maquinari, sinó també de la velocitat de lliurament del contingut als usuaris. Exemple: es pot cercar un enregistrament del moment decisiu d'un partit d'hoquei en un minut després del propi esdeveniment.

Codificació seqüencial

Per tant, la felicitat de l'usuari depèn en gran mesura de la rapidesa amb què el vídeo està disponible. I això ve determinat principalment per la velocitat de transcodificació. Quan no hi ha requisits estrictes per a la velocitat de pujada de vídeo, no hi ha problemes. Agafes un únic fitxer indivisible, el converteixes i el penges. Al principi del nostre viatge, així és com vam treballar:

Com hem accelerat la codificació de vídeo vuit vegades

El client carrega el vídeo a l'emmagatzematge, el component Analyzer recopila metainformació i transfereix el vídeo al component Worker per a la conversió. Totes les etapes es realitzen de manera seqüencial. En aquest cas, hi pot haver molts servidors de codificació, però només un està ocupat processant un vídeo específic. Diagrama senzill i transparent. Aquí és on acaben els seus avantatges. Aquest esquema només es pot escalar verticalment (a causa de la compra de servidors més potents).

Codificació seqüencial amb resultat intermedi

Per suavitzar d'alguna manera la dolorosa espera, la indústria va proposar una opció de codificació ràpida. El nom és enganyós, perquè de fet, la codificació completa es produeix de manera seqüencial i triga el mateix temps. Però amb un resultat intermedi. La idea és la següent: preparar i publicar una versió de baixa resolució del vídeo tan aviat com sigui possible, i només després versions de més alta resolució.

D'una banda, el vídeo està disponible més ràpidament. I és útil per a esdeveniments importants. Però, d'altra banda, la imatge resulta borrosa i això molesta als espectadors.

Resulta que no només cal processar ràpidament el vídeo, sinó també mantenir-ne la qualitat. Això és el que els usuaris esperen ara d'un servei de vídeo. Pot semblar que n'hi ha prou amb comprar els servidors més productius (i actualitzar-los tots alhora). Però això és un carreró sense sortida, perquè sempre hi ha un vídeo que farà que fins i tot el maquinari més potent s'alenteix.

Codificació paral·lela

És molt més eficient dividir un problema complex en molts de menys complexos i resoldre'ls en paral·lel en diferents servidors. Això és MapReduce per a vídeo. En aquest cas, no estem limitats pel rendiment d'un servidor i podem escalar horitzontalment (afegint noves màquines).

Per cert, la idea de dividir vídeos en trossos petits, processar-los en paral·lel i enganxar-los no és cap secret. Podeu trobar moltes referències a aquest enfocament (per exemple, a Habré us recomano una publicació sobre el projecte DistVIDc). Però això no fa que sigui més fàcil en general, perquè no podeu prendre una solució ja feta i incorporar-la a casa vostra. Necessitem una adaptació a la nostra infraestructura, al nostre vídeo i fins i tot a la nostra càrrega. En general, és més fàcil escriure el vostre.

Així, a la nova arquitectura, vam dividir el bloc monolític de treballador amb codificació seqüencial en microserveis Segmenter, Tcoder, Combiner.

Com hem accelerat la codificació de vídeo vuit vegades

  1. El segmentador divideix el vídeo en fragments d'aproximadament 10 segons. Els fragments consisteixen en un o més GOP (grup d'imatges). Cada GOP és independent i codificat per separat, de manera que es pot descodificar sense referència a trames d'altres GOP. És a dir, els fragments es poden reproduir independentment els uns dels altres. Aquesta fragmentació redueix la latència i permet que el processament comenci abans.
  2. Tcoder processa cada fragment. Pren una tasca de la cua, baixa un fragment de l'emmagatzematge, el codifica en diferents resolucions (recordeu que el jugador pot triar una versió en funció de la velocitat de connexió), després torna a posar el resultat a l'emmagatzematge i marca el fragment com a processat. a la base de dades. Després d'haver processat tots els fragments, Tcoder envia la tasca per generar resultats per al següent component.
  3. Combiner recull els resultats junts: descarrega tots els fragments fets per Tcoder, genera fluxos per a diferents resolucions.

Unes paraules sobre el so. El còdec d'àudio AAC més popular té una característica desagradable. Si codifiqueu fragments per separat, simplement no podreu enganxar-los perfectament. Les transicions es notaran. Els còdecs de vídeo no tenen aquest problema. Teòricament, podeu buscar una solució tècnica complexa, però aquest joc simplement no val la pena encara (l'àudio pesa molt menys que el vídeo). Per tant, només es codifica el vídeo en paral·lel i es processa tota la pista d'àudio.

Troballes

Gràcies al processament de vídeo paral·lel, hem reduït significativament el retard entre que un vídeo se'ns penja i està disponible per als usuaris. Per exemple, abans podien trigar dues hores a crear diverses versions completes de diferent qualitat per a una pel·lícula FullHD d'una hora i mitja de durada. Ara tot això triga 15 minuts. A més, amb el processament paral·lel, creem una versió d'alta resolució fins i tot més ràpid que una versió de baixa resolució amb l'antic enfocament de resultats intermedis.

I una cosa més. Amb l'enfocament antic, o no hi havia prou servidors, o estaven inactius sense tasques. La codificació paral·lela us permet augmentar la quota de reciclatge de ferro. Ara el nostre clúster de més de mil servidors està sempre ocupat amb alguna cosa.

De fet, encara hi ha marge de millora. Per exemple, podem estalviar molt de temps si comencem a processar fragments del vídeo abans que ens arribi sencer. Com diuen, en vindran més.

Escriu als comentaris quines tasques en l'àmbit del treball amb vídeo t'agradaria llegir.

Enllaços útils a l'experiència dels companys del sector

Font: www.habr.com

Afegeix comentari