Comment nous avons accéléré l'encodage vidéo huit fois



Chaque jour, des millions de tĂ©lĂ©spectateurs regardent des vidĂ©os sur Internet. Mais pour que la vidĂ©o soit disponible, elle doit non seulement ĂȘtre tĂ©lĂ©chargĂ©e sur le serveur, mais Ă©galement traitĂ©e. Plus cela se produit rapidement, meilleurs sont le service et ses utilisateurs.

Je m'appelle Askar Kamalov, il y a un an, j'ai rejoint l'équipe de technologie vidéo Yandex. Aujourd'hui, je vais expliquer briÚvement aux lecteurs de Habr comment, en utilisant la parallélisation du processus de codage, nous avons réussi à accélérer la livraison de vidéos à l'utilisateur à plusieurs reprises.

Ce message intéressera principalement ceux qui n'ont pas pensé à ce qui se passe sous le capot des services vidéo. Dans les commentaires, vous pouvez poser des questions et suggérer des sujets pour de futurs articles.

Quelques mots sur la tĂąche elle-mĂȘme. Yandex aide non seulement Ă  rechercher des vidĂ©os sur d'autres sites, mais stocke Ă©galement des vidĂ©os pour ses propres services. Qu'il s'agisse d'un programme d'auteur ou d'un match de sport dans Ether, d'un film sur KinoPoisk ou de vidĂ©os dans Zen et News - tout cela est tĂ©lĂ©chargĂ© sur nos serveurs. Pour que les utilisateurs regardent une vidĂ©o, elle doit ĂȘtre prĂ©parĂ©e: la convertir au format requis, crĂ©er un aperçu ou mĂȘme la piloter via la technologie DeepHD . Un fichier non prĂ©parĂ© prend juste de la place. Et nous parlons non seulement de l'utilisation optimale du fer, mais aussi de la vitesse de livraison du contenu aux utilisateurs. Exemple: un record avec le moment dĂ©cisif d'un match de hockey peut ĂȘtre recherchĂ© dans la recherche dans la minute qui suit l'Ă©vĂ©nement lui-mĂȘme.

Codage séquentiel


Ainsi, le bonheur de l'utilisateur dépend en grande partie de la rapidité avec laquelle la vidéo devient disponible. Et cela est principalement déterminé par la vitesse de transcodage. Lorsqu'il n'y a pas d'exigences strictes pour la vitesse de téléchargement vidéo, il n'y a pas de problÚme. Prenez un fichier unique et indivisible, convertissez-le, téléchargez. Au début de notre voyage, nous avons travaillé comme ceci:



Le client tĂ©lĂ©charge la vidĂ©o dans le rĂ©fĂ©rentiel, le composant Analyzer collecte des mĂ©ta-informations et transfĂšre la vidĂ©o pour la conversion vers le composant Worker. Toutes les Ă©tapes sont exĂ©cutĂ©es sĂ©quentiellement. Dans le mĂȘme temps, il peut y avoir de nombreux serveurs pour l'encodage, mais un seul est occupĂ© Ă  traiter une vidĂ©o spĂ©cifique. Disposition simple et transparente. C'est lĂ  que ses mĂ©rites s'arrĂȘtent. Un tel schĂ©ma Ă©volue uniquement verticalement (en raison de l'achat de serveurs plus puissants).

Codage séquentiel avec résultat intermédiaire


Afin d'atténuer en quelque sorte les attentes douloureuses, l'industrie a proposé une option de codage rapide. C'est un nom trompeur, car en fait, le codage à part entiÚre a lieu séquentiellement et aussi longtemps. Mais avec un résultat intermédiaire. L'idée est la suivante: préparer et télécharger la version basse résolution de la vidéo dÚs que possible, et seulement plus tard - des versions haute résolution.

D'une part, la vidéo devient plus rapide. Et il est utile pour les événements importants. Mais de l'autre - l'image est floue, et cela agace le public.

Il s'avĂšre que vous devez non seulement traiter rapidement la vidĂ©o, mais Ă©galement prĂ©server sa qualitĂ©. C'est ce que les utilisateurs attendent dĂ©sormais d'un service vidĂ©o. Il peut sembler suffisant d'acheter les serveurs les plus productifs (et de les mettre Ă  niveau rĂ©guliĂšrement tous en mĂȘme temps). Mais c'est une voie vers une impasse, car il y a toujours une vidĂ©o qui ralentira mĂȘme le matĂ©riel le plus puissant.

Codage parallĂšle


Il est beaucoup plus efficace de diviser une tùche difficile en plusieurs tùches moins complexes et de les résoudre simultanément sur différents serveurs. Tel est MapReduce pour la vidéo. Dans ce cas, nous ne nous reposons pas sur les performances d'un seul serveur et pouvons évoluer horizontalement (en ajoutant de nouvelles machines).

Soit dit en passant, l'idĂ©e de diviser une vidĂ©o en petits morceaux, de les traiter et de les coller simultanĂ©ment n'est pas un secret. Vous pouvez trouver de nombreuses rĂ©fĂ©rences Ă  cette approche (par exemple, sur HabrĂ© je recommande un article sur le projet DistVIDc ). Mais cela ne facilite gĂ©nĂ©ralement pas la tĂąche, car vous ne pouvez pas simplement prendre une solution toute faite et l'intĂ©grer Ă  vous-mĂȘme. Nous devons nous adapter Ă  notre infrastructure, Ă  notre vidĂ©o et mĂȘme Ă  notre charge de travail. En gĂ©nĂ©ral, il est plus facile d'Ă©crire le vĂŽtre.

Ainsi, dans la nouvelle architecture, nous avons divisé le bloc Worker monolithique avec codage séquentiel en microservices Segmenter, Tcoder, Combiner.



  1. Segmenter divise la vidĂ©o en fragments en environ 10 secondes. Les fragments sont constituĂ©s d'un ou plusieurs GOP ( groupe d'images ). Chaque GOP est indĂ©pendant et codĂ© sĂ©parĂ©ment, de sorte qu'il peut ĂȘtre dĂ©codĂ© sans rĂ©fĂ©rence aux trames des autres GOP. Autrement dit, les fragments peuvent ĂȘtre reproduits indĂ©pendamment les uns des autres. Cette segmentation rĂ©duit la latence, vous permettant de commencer le traitement plus tĂŽt.
  2. Tcoder . , , (, , ), . , Tcoder .
  3. ombiner : , Tcoder, .

Quelques mots sur le son. Le codec audio AAC le plus populaire a une fonction désagréable. Si vous codez les fragments séparément, les coller ensemble de maniÚre transparente ne fonctionnera tout simplement pas. Les transitions seront perceptibles. Les codecs vidéo n'ont pas un tel problÚme. Théoriquement, vous pouvez rechercher une solution technique difficile, mais ce jeu ne vaut tout simplement pas la chandelle (l'audio pÚse beaucoup moins que la vidéo). Par conséquent, seule la vidéo est codée en parallÚle avec nous et la piste audio est traitée dans son ensemble.

résultats


Grùce au traitement vidéo parallÚle, nous avons considérablement réduit le délai entre le téléchargement d'une vidéo pour nous et sa disponibilité pour les utilisateurs. Par exemple, auparavant, il pouvait prendre deux heures pour créer plusieurs versions complÚtes de qualité différente pour un film FullHD d'une durée d'une heure et demie. Maintenant, tout cela prend 15 minutes. De plus, en traitement parallÚle, nous créons une version haute résolution encore plus rapide qu'une version basse résolution avec l'ancienne approche avec un résultat intermédiaire.

Et quelque chose d'autre. Avec l'ancienne approche, les serveurs pouvaient ĂȘtre manquants ou ils Ă©taient inactifs sans tĂąches. Le codage parallĂšle peut augmenter la part d'utilisation du fer. Maintenant, notre cluster de plus d'un millier de serveurs est toujours occupĂ© par quelque chose.

En fait, il y a encore place Ă  amĂ©lioration. Par exemple, nous pouvons gagner beaucoup de temps si nous commençons Ă  traiter des fragments d'une vidĂ©o avant mĂȘme qu'elle ne soit arrivĂ©e en entier. Comme ils disent, plus loin - plus.

Écrivez dans les commentaires sur les tĂąches dans le domaine du travail avec la vidĂ©o que vous souhaitez lire.

Liens utiles avec les pairs de l'industrie



All Articles