Come abbiamo accelerato la codifica video di otto volte

Come abbiamo accelerato la codifica video di otto volte

Ogni giorno milioni di spettatori guardano video su Internet. Ma affinché il video diventi disponibile, non deve solo essere caricato sul server, ma anche elaborato. Quanto più velocemente ciò avviene, tanto meglio è per il servizio e i suoi utenti.

Mi chiamo Askar Kamalov, un anno fa sono entrato a far parte del team di tecnologia video Yandex. Oggi racconterò brevemente ai lettori di Habr come, parallelizzando il processo di codifica, siamo riusciti ad accelerare notevolmente la consegna del video all'utente.

Questo post interesserà principalmente coloro che non hanno mai pensato in precedenza a cosa succede sotto il cofano dei servizi video. Nei commenti puoi porre domande e suggerire argomenti per i post futuri.

Qualche parola sul compito stesso. Yandex non solo ti aiuta a cercare video su altri siti, ma memorizza anche video per i propri servizi. Che si tratti di un programma originale o di una partita sportiva in onda, di un film su KinoPoisk o di video su Zen e News, tutto questo viene caricato sui nostri server. Affinché gli utenti possano guardare il video, è necessario che sia preparato: convertito nel formato richiesto, creato un'anteprima o addirittura sottoposto a tecnologia DeepHD. Un file non preparato occupa solo spazio. Inoltre, non stiamo parlando solo dell'uso ottimale dell'hardware, ma anche della velocità di consegna dei contenuti agli utenti. Esempio: la registrazione del momento decisivo di una partita di hockey può essere ricercata entro un minuto dall'evento stesso.

Codifica sequenziale

Pertanto, la felicità dell'utente dipende in gran parte dalla rapidità con cui il video diventa disponibile. E questo è determinato principalmente dalla velocità di transcodifica. Quando non ci sono requisiti rigorosi per la velocità di caricamento dei video, non ci sono problemi. Prendi un unico file indivisibile, convertilo e caricalo. All’inizio del nostro viaggio, ecco come lavoravamo:

Come abbiamo accelerato la codifica video di otto volte

Il client carica il video nell'archivio, il componente Analizzatore raccoglie metainformazioni e trasferisce il video al componente Worker per la conversione. Tutte le fasi vengono eseguite in sequenza. In questo caso, possono esserci molti server di codifica, ma solo uno è impegnato nell'elaborazione di un video specifico. Diagramma semplice e trasparente. È qui che finiscono i suoi vantaggi. Questo schema può essere scalato solo verticalmente (grazie all'acquisto di server più potenti).

Codifica sequenziale con risultato intermedio

Per appianare in qualche modo la dolorosa attesa, l'industria ha ideato un'opzione di codifica rapida. Il nome è fuorviante perché in realtà la codifica completa avviene in sequenza e richiede altrettanto tempo. Ma con un risultato intermedio. L'idea è questa: preparare e pubblicare il più rapidamente possibile una versione a bassa risoluzione del video e solo successivamente le versioni a risoluzione più alta.

Da un lato, il video diventa disponibile più velocemente. Ed è utile per eventi importanti. Ma d'altra parte, l'immagine risulta sfocata e questo infastidisce gli spettatori.

Si scopre che è necessario non solo elaborare rapidamente il video, ma anche mantenerne la qualità. Questo è ciò che gli utenti si aspettano ora da un servizio video. Può sembrare che sia sufficiente acquistare i server più produttivi (e aggiornarli regolarmente tutti in una volta). Ma questo è un vicolo cieco, perché c'è sempre un video che rallenterà anche l'hardware più potente.

Codifica parallela

È molto più efficiente dividere un problema complesso in tanti problemi meno complessi e risolverli in parallelo su server diversi. Questo è MapReduce per i video. In questo caso non siamo limitati dalle prestazioni di un server e possiamo scalare orizzontalmente (aggiungendo nuove macchine).

A proposito, l'idea di dividere i video in piccoli pezzi, elaborarli in parallelo e incollarli insieme non è un segreto. Potete trovare molti riferimenti a questo approccio (su Habré ad esempio consiglio un post sul progetto DistVIDc). Ma questo non rende le cose complessivamente più semplici, perché non puoi semplicemente prendere una soluzione già pronta e integrarla nella tua casa. Abbiamo bisogno di adattamenti alla nostra infrastruttura, ai nostri video e persino al nostro carico. In generale, è più facile scriverne uno tuo.

Quindi, nella nuova architettura, abbiamo suddiviso il blocco monolitico Worker con codifica sequenziale nei microservizi Segmenter, Tcoder, Combiner.

Come abbiamo accelerato la codifica video di otto volte

  1. Segmenter suddivide il video in frammenti di circa 10 secondi. I frammenti sono costituiti da uno o più GOP (gruppo di immagini). Ogni GOP è indipendente e codificato separatamente in modo che possa essere decodificato senza riferimento ai frame di altri GOP. Cioè, i frammenti possono essere riprodotti indipendentemente l'uno dall'altro. Questo partizionamento riduce la latenza, consentendo all'elaborazione di iniziare prima.
  2. Tcoder elabora ogni frammento. Prende un'attività dalla coda, scarica un frammento dall'archivio, lo codifica in diverse risoluzioni (ricorda che il giocatore può scegliere una versione in base alla velocità di connessione), quindi rimette il risultato nell'archivio e contrassegna il frammento come elaborato nella banca dati. Dopo aver elaborato tutti i frammenti, Tcoder invia l'attività per generare risultati per il componente successivo.
  3. Combiner raccoglie insieme i risultati: scarica tutti i frammenti realizzati da Tcoder, genera flussi per diverse risoluzioni.

Qualche parola sul suono. Il codec audio AAC più popolare ha una caratteristica spiacevole. Se codifichi i frammenti separatamente, semplicemente non sarai in grado di incollarli insieme senza problemi. Le transizioni saranno evidenti. I codec video non presentano questo problema. In teoria, puoi cercare una soluzione tecnica complessa, ma questo gioco semplicemente non vale ancora la candela (l'audio pesa molto meno del video). Pertanto, solo il video viene codificato in parallelo e viene elaborata l'intera traccia audio.

Giudizio

Grazie all'elaborazione video parallela, abbiamo ridotto significativamente il ritardo tra il caricamento di un video su di noi e la disponibilità per gli utenti. Ad esempio, prima potevano essere necessarie due ore per creare diverse versioni complete di diversa qualità per un film FullHD della durata di un'ora e mezza. Ora tutto questo richiede 15 minuti. Inoltre, con l'elaborazione parallela, creiamo una versione ad alta risoluzione ancora più velocemente di una versione a bassa risoluzione con il vecchio approccio ai risultati intermedi.

E un'altra cosa. Con il vecchio approccio, o non c'erano abbastanza server oppure erano inattivi senza attività. La codifica parallela consente di aumentare la quota di riciclo del ferro. Ora il nostro cluster di oltre mille server è sempre impegnato con qualcosa.

In effetti c’è ancora margine di miglioramento. Ad esempio, possiamo risparmiare molto tempo se iniziamo a elaborare frammenti del video prima che ci arrivi nella sua interezza. Come si suol dire, ne seguiranno altri.

Scrivi nei commenti di quali compiti nel campo del lavoro con i video vorresti leggere.

Collegamenti utili all'esperienza dei colleghi del settore

Fonte: habr.com

Aggiungi un commento