Wéi mir d'Videokodéierung ëm aacht Mol beschleunegt hunn

Wéi mir d'Videokodéierung ëm aacht Mol beschleunegt hunn

All Dag kucken Millioune Zuschauer Videoen um Internet. Awer fir datt de Video verfügbar ass, muss et net nëmmen op de Server eropgeluede ginn, awer och veraarbecht ginn. Wat méi séier dëst geschitt, wat besser fir de Service a seng Benotzer.

Mäin Numm ass Askar Kamalov, virun engem Joer sinn ech an d'Yandex Videotechnologie Team bäikomm. Haut wäert ech dem Habr Lieser kuerz soen wéi mir, andeems de Kodéierungsprozess paralleliséiert, et fäerdeg bruecht huet d'Liwwerung vum Video un de Benotzer wesentlech ze beschleunegen.

Dëse Post wäert virun allem interessant sinn fir déi, déi net virdru geduecht hunn wat ënner der Hood vu Videoservicer geschitt. An de Kommentarer kënnt Dir Froen stellen an Themen fir zukünfteg Posts proposéieren.

E puer Wierder iwwert d'Aufgab selwer. Yandex hëlleft Iech net nëmmen no Videoen op anere Site ze sichen, awer späichert och Videoe fir seng eege Servicer. Egal ob et en originelle Programm oder e Sportsmatch op der Loft ass, e Film op KinoPoisk oder Videoen op Zen an News - all dat gëtt op eise Server eropgelueden. Fir d'Benotzer de Video ze kucken, muss et virbereet ginn: an dat erfuerderlecht Format ëmgewandelt, eng Virschau erstallt oder souguer duerch Technologie lafen DeepHD. Eng onpreparéiert Datei hëlt just Plaz op. Ausserdeem schwätze mir net nëmmen iwwer déi optimal Notzung vun der Hardware, awer och iwwer d'Geschwindegkeet vun der Liwwerung vum Inhalt un d'Benotzer. Beispill: eng Opzeechnung vum entscheedende Moment vun engem Hockeystick Match kann bannent enger Minutt no der Manifestatioun selwer gesicht ginn.

Sequentiell Kodéierung

Also, d'Gléck vum Benotzer hänkt haaptsächlech dovun of wéi séier de Video verfügbar ass. An dëst gëtt haaptsächlech vun der Transkodéierungsgeschwindegkeet bestëmmt. Wann et keng strikt Ufuerderunge fir Video Eropluedsgeschwindegkeet sinn, da gi keng Probleemer. Dir huelt eng eenzeg, ondeelbar Datei, konvertéiert se a luet se erop. Am Ufank vun eiser Rees hu mir esou geschafft:

Wéi mir d'Videokodéierung ëm aacht Mol beschleunegt hunn

De Client lued de Video op d'Späichere erop, den Analyzer-Komponent sammelt Meta-Informatioun an iwwerdréit de Video op d'Worker-Komponent fir d'Konversioun. All Etappe ginn sequenziell duerchgefouert. An dësem Fall kënnen et vill Kodéierungsserver sinn, awer nëmmen een ass beschäftegt mat engem spezifesche Video ze veraarbecht. Einfach, transparent Diagramm. Dëst ass wou seng Virdeeler ophalen. Dëse Schema kann nëmme vertikal skaléiert ginn (wéinst dem Kaf vu méi mächtege Serveren).

Sequentiell Kodéierung mat Tëscheresultat

Fir iergendwéi déi schmerzhafte Waarde ze glatten, ass d'Industrie mat enger séier Kodéierungsoptioun erauskomm. Den Numm ass täuschend, well tatsächlech voll Kodéierung geschitt sequenziell an dauert grad sou laang. Awer mat engem Tëscheresultat. D'Iddi ass dëst: preparéieren a verëffentlechen eng niddereg-Resolutioun Versioun vum Video sou séier wéi méiglech, an nëmmen dann méi héich-Resolutioun Versiounen.

Engersäits gëtt de Video méi séier verfügbar. An et ass nëtzlech fir wichteg Evenementer. Awer op der anerer Säit gëtt d'Bild onschëlleg, an dat nervt d'Zuschauer.

Et stellt sech eraus datt Dir de Video net nëmme séier muss veraarbecht, awer och seng Qualitéit erhalen. Dëst ass wat d'Benotzer elo vun engem Videoservice erwaarden. Et kann schéngen datt et genuch ass déi produktivst Serveren ze kafen (a se regelméisseg op eemol upgrade). Awer dëst ass en Doudegen, well et gëtt ëmmer e Video deen och déi mächtegst Hardware verlangsamt mécht.

Parallel Kodéierung

Et ass vill méi effizient e komplexe Problem a vill manner komplex opzedeelen an se parallel op verschiddene Serveren ze léisen. Dëst ass MapReduce fir Video. An dësem Fall si mir net limitéiert duerch d'Leeschtung vun engem Server a kënne horizontal skala (duerch nei Maschinnen derbäi).

Iwwregens, d'Iddi fir Videoen a kleng Stécker opzedeelen, se parallel ze veraarbecht a se zesummen ze pechen ass kee Geheimnis. Dir kënnt vill Referenzen op dës Approche fannen (zum Beispill op Habré recommandéieren ech e Post iwwer de Projet DistVIDc). Awer dëst mécht et allgemeng net méi einfach, well Dir kënnt net nëmmen eng fäerdeg Léisung huelen an se an Äert Heem bauen. Mir brauchen Upassung un eis Infrastruktur, eise Video a souguer eis Laascht. Am Allgemengen ass et méi einfach Är eege ze schreiwen.

Also, an der neier Architektur hu mir de monolithesche Worker Block mat sequenziell Kodéierung a Mikroservicer Segmenter, Tcoder, Combiner opgedeelt.

Wéi mir d'Videokodéierung ëm aacht Mol beschleunegt hunn

  1. Segmenter brécht de Video a Fragmenter vun ongeféier 10 Sekonnen. Fragmenter besteet aus engem oder méi GOPs (Grupp vu Biller). All GOP ass onofhängeg a getrennt kodéiert sou datt et ouni Referenz op Frames vun anere GOPs dekodéiert ka ginn. Dat ass, Fragmenter kënnen onofhängeg vuneneen gespillt ginn. Dës Sharding reduzéiert d'Latenz, wat d'Veraarbechtung erlaabt méi fréi unzefänken.
  2. Tcoder veraarbecht all Fragment. Et hëlt eng Aufgab aus der Schlaang, luet e Fragment aus der Späichere erof, codéiert et a verschidde Resolutiounen (erënnert datt de Spiller eng Versioun baséiert op der Verbindungsgeschwindegkeet ka wielen), da setzt d'Resultat zréck an d'Späichere a markéiert de Fragment als veraarbecht. an der Datebank. Nodeems Dir all Fragmenter veraarbecht hutt, schéckt Tcoder d'Aufgab fir Resultater fir déi nächst Komponent ze generéieren.
  3. Combiner sammelt d'Resultater zesummen: Luet all d'Fragmenter vun Tcoder erof, generéiert Streame fir verschidde Resolutiounen.

E puer Wierder iwwer Toun. De beléifsten AAC Audio Codec huet eng désagréabel Fonktioun. Wann Dir Fragmenter getrennt codéiert, da kënnt Dir einfach net fäeg sinn se nahtlos zesummen ze pechen. Iwwergäng wäerten opfälleg sinn. Video Codecs hunn dëse Problem net. Theoretesch kënnt Dir no enger komplexer technescher Léisung sichen, awer dëst Spill ass einfach d'Käerz nach net wäert (Audio weegt wesentlech manner wéi Video). Dofir gëtt nëmmen de Video parallel kodéiert, an déi ganz Audiostreck gëtt veraarbecht.

Resultater

Dank der parallele Videoveraarbechtung hu mir d'Verspéidung tëscht engem Video deen eis eropgeluede gëtt an de Benotzer verfügbar ass wesentlech reduzéiert. Zum Beispill, virdru konnt et zwou Stonnen daueren fir verschidde voll Versioune vu verschiddene Qualitéit fir e FullHD Film ze kreéieren deen eng Stonn an eng hallef dauert. Elo dauert dat alles 15 Minutten. Desweideren, mat parallel Veraarbechtung, mir schafen eng héich-Resolutioun Versioun nach méi séier wéi eng niddereg-Resolutioun Versioun mat der aler Mëttelstuf Resultat Approche.

An nach eng Saach. Mat der aler Approche waren entweder net genuch Serveren, oder si waren ouni Aufgaben idle. Parallel Kodéierung erlaabt Iech den Undeel vum Eisenverwäertung ze erhéijen. Elo ass eise Cluster vu méi wéi dausend Serveren ëmmer mat eppes beschäftegt.

Tatsächlech ass et nach Plaz fir Verbesserung. Zum Beispill kënne mir bedeitend Zäit spueren wa mir Fragmenter vum Video ufänken ze veraarbechten ier et a senger Ganzheet bei eis kënnt. Wéi se soen, méi ze kommen.

Schreift an de Kommentaren iwwer wéi eng Aufgaben am Beräich vun der Aarbecht mat Video Dir gäre liesen.

Nëtzlech Linken op d'Erfahrung vun Industriekollegen

Source: will.com

Setzt e Commentaire