Kuinka nopeutimme videon koodausta kahdeksan kertaa

Kuinka nopeutimme videon koodausta kahdeksan kertaa

Joka päivä miljoonat katsojat katsovat videoita Internetissä. Mutta jotta video tulee saataville, se ei ole vain ladattava palvelimelle, vaan se on myös käsiteltävä. Mitä nopeammin tämä tapahtuu, sitä parempi palvelulle ja sen käyttäjille.

Nimeni on Askar Kamalov, vuosi sitten liityin Yandexin videotekniikkatiimiin. Tänään kerron lyhyesti Habrin lukijoille siitä, kuinka koodausprosessin rinnakkain onnistuimme nopeuttamaan merkittävästi videon toimittamista käyttäjälle.

Tämä postaus kiinnostaa ensisijaisesti niitä, jotka eivät ole aiemmin miettineet, mitä videopalveluiden hupun alla tapahtuu. Kommenteissa voit esittää kysymyksiä ja ehdottaa aiheita tuleville postauksille.

Muutama sana itse tehtävästä. Yandex ei vain auta sinua etsimään videoita muilta sivustoilta, vaan myös tallentaa videoita omille palveluilleen. Olipa kyseessä alkuperäinen ohjelma tai urheiluottelu lähetyksessä, elokuva KinoPoiskissa tai videot Zenissä ja Newsissa – kaikki tämä ladataan palvelimillemme. Jotta käyttäjät voivat katsoa videon, se on valmisteltava: muunnettava vaadittuun muotoon, luotava esikatselu tai jopa ajettava tekniikan läpi DeepHD. Valmistelematon tiedosto vie vain tilaa. Lisäksi emme puhu vain laitteiston optimaalisesta käytöstä, vaan myös sisällön toimittamisen nopeudesta käyttäjille. Esimerkki: tallenne jääkiekkoottelun ratkaisevasta hetkestä voidaan etsiä minuutin sisällä itse tapahtumasta.

Jaksottainen koodaus

Joten käyttäjän onnellisuus riippuu suurelta osin siitä, kuinka nopeasti video tulee saataville. Ja tämä määräytyy pääasiassa transkoodausnopeuden perusteella. Kun videon latausnopeudelle ei ole tiukkoja vaatimuksia, ei ole ongelmia. Otat yhden jakamattoman tiedoston, muunnat sen ja lataat sen. Matkamme alussa toimimme seuraavasti:

Kuinka nopeutimme videon koodausta kahdeksan kertaa

Asiakas lataa videon tallennustilaan, Analyzer-komponentti kerää metatiedot ja siirtää videon Worker-komponenttiin muuntamista varten. Kaikki vaiheet suoritetaan peräkkäin. Tässä tapauksessa koodauspalvelimia voi olla useita, mutta vain yksi käsittelee tiettyä videota. Yksinkertainen, läpinäkyvä kaavio. Tähän sen edut loppuvat. Tätä mallia voidaan skaalata vain pystysuunnassa (johtuen tehokkaampien palvelimien ostosta).

Jaksottainen koodaus välituloksella

Tasoittaakseen jotenkin tuskallista odottelua teollisuus keksi nopean koodausvaihtoehdon. Nimi on harhaanjohtava, koska itse asiassa täysi koodaus tapahtuu peräkkäin ja kestää yhtä kauan. Mutta välituloksella. Ideana on tämä: valmistele ja julkaise videosta mahdollisimman nopeasti matalaresoluutioinen versio ja vasta sitten korkearesoluutioiset versiot.

Toisaalta video tulee saataville nopeammin. Ja se on hyödyllinen tärkeissä tapahtumissa. Mutta toisaalta kuvasta tulee epäselvä, ja tämä ärsyttää katsojia.

Osoittautuu, että sinun ei tarvitse vain käsitellä videota nopeasti, vaan myös säilyttää sen laatu. Tätä käyttäjät odottavat videopalvelulta nyt. Saattaa vaikuttaa siltä, ​​että riittää ostamaan tuottavimmat palvelimet (ja päivittämään ne kaikki kerralla säännöllisesti). Mutta tämä on umpikuja, koska aina on video, joka saa tehokkaimmankin laitteiston hidastamaan.

Rinnakkainen koodaus

On paljon tehokkaampaa jakaa monimutkainen ongelma useisiin vähemmän monimutkaisiin ja ratkaista ne rinnakkain eri palvelimilla. Tämä on MapReduce videoille. Tässä tapauksessa emme rajoita yhden palvelimen suorituskykyä ja voimme skaalata vaakasuunnassa (lisäämällä uusia koneita).

Muuten, ajatus videoiden jakamisesta pieniin osiin, niiden rinnakkaiseen käsittelyyn ja liimaamiseen ei ole mikään salaisuus. Löydät monia viittauksia tähän lähestymistapaan (esimerkiksi Habréssa suosittelen postausta projektista DistVIDc). Mutta tämä ei tee siitä yhtään helpompaa, koska et voi vain ottaa valmiita ratkaisuja ja rakentaa sitä kotiisi. Tarvitsemme mukauttamista infrastruktuuriimme, videoomme ja jopa kuormiteemme. Yleensä on helpompi kirjoittaa omia.

Joten uudessa arkkitehtuurissa jaoimme monoliittisen Worker-lohkon peräkkäisellä koodauksella mikropalveluihin Segmenter, Tcoder, Combiner.

Kuinka nopeutimme videon koodausta kahdeksan kertaa

  1. Segmentoija jakaa videon noin 10 sekunnin pituisiksi fragmenteiksi. Fragmentit koostuvat yhdestä tai useammasta GOP:sta (ryhmä kuvia). Jokainen GOP on itsenäinen ja koodattu erikseen, jotta se voidaan dekoodata ilman viittausta muiden GOP:ien kehyksiin. Toisin sanoen fragmentteja voidaan soittaa toisistaan ​​riippumatta. Tämä sirpalointi vähentää viivettä, jolloin käsittely voidaan aloittaa aikaisemmin.
  2. Tcoder käsittelee jokaisen fragmentin. Se ottaa tehtävän jonosta, lataa fragmentin tallennustilasta, koodaa sen eri resoluutioihin (muista, että pelaaja voi valita version yhteysnopeuden perusteella), sitten laittaa tuloksen takaisin tallennustilaan ja merkitsee fragmentin käsitellyksi. tietokannassa. Käsiteltyään kaikki fragmentit Tcoder lähettää tehtävän tuottaakseen tulokset seuraavalle komponentille.
  3. Combiner kerää tulokset yhteen: lataa kaikki Tcoderin tekemät fragmentit, luo streameja eri resoluutioille.

Muutama sana äänestä. Suosituimmassa AAC-äänikoodekissa on epämiellyttävä ominaisuus. Jos koodaat fragmentteja erikseen, et yksinkertaisesti voi liimata niitä yhteen saumattomasti. Siirtymät tulevat olemaan havaittavissa. Videokoodekeissa ei ole tätä ongelmaa. Teoreettisesti voit etsiä monimutkaisia ​​teknisiä ratkaisuja, mutta tämä peli ei yksinkertaisesti ole vielä kynttilän arvoinen (ääni painaa huomattavasti vähemmän kuin video). Siksi vain video koodataan rinnakkain ja koko ääniraita käsitellään.

Tulokset

Rinnakkaisen videokäsittelyn ansiosta olemme merkittävästi vähentäneet viivettä videon lataamisen meille ja sen välillä, että se on käyttäjien saatavilla. Aiemmin esimerkiksi puolitoista tuntia kestävälle FullHD-elokuvalle useiden erilaatuisten täysversioiden luomiseen saattoi mennä kaksi tuntia. Nyt kaikki tämä kestää 15 minuuttia. Lisäksi rinnakkaiskäsittelyllä luomme korkearesoluutioisen version jopa nopeammin kuin matalaresoluutioinen versio vanhalla välituloslähestymistavalla.

Ja vielä yksi asia. Vanhalla lähestymistavalla joko palvelimia ei ollut tarpeeksi tai ne olivat valmiina ilman tehtäviä. Rinnakkaiskoodauksen avulla voit lisätä raudan kierrätyksen osuutta. Nyt yli tuhannen palvelimen klusterimme on aina kiireinen jollakin.

Itse asiassa parantamisen varaa on edelleen. Voimme esimerkiksi säästää huomattavasti aikaa, jos alamme käsitellä videon katkelmia ennen kuin se saapuu meille kokonaisuudessaan. Kuten sanotaan, lisää tulossa.

Kirjoita kommentteihin, mistä videon kanssa työskentelyn tehtävistä haluaisit lukea.

Hyödyllisiä linkkejä alan kollegoiden kokemuksiin

Lähde: will.com

Lisää kommentti