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

Comment nous avons accéléré l'encodage vidéo de 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, mieux c'est pour 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 parallélisant le processus d'encodage, nous avons réussi à accélérer considérablement la livraison de la vidéo à l'utilisateur.

Cet article intéressera principalement ceux qui n’ont pas encore réfléchi à 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 vous 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 original ou d'un match sportif diffusé, d'un film sur KinoPoisk ou de vidéos sur Zen et News, tout cela est téléchargé sur nos serveurs. Pour que les utilisateurs puissent regarder la vidéo, elle doit être préparée : convertie au format requis, créée un aperçu ou même exécutée via la technologie DeepHD. Un fichier non préparé prend simplement de la place. De plus, nous parlons non seulement de l'utilisation optimale du matériel, mais également de la rapidité de livraison du contenu aux utilisateurs. Exemple : un enregistrement du moment décisif d'un match de hockey peut être recherché dans la minute qui suit l'événement lui-même.

Encodage 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 en matière de vitesse de téléchargement des vidéos, il n’y a aucun problème. Vous prenez un fichier unique et indivisible, vous le convertissez et vous le téléchargez. Au début de notre voyage, voici comment nous avons travaillé :

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

Le client télécharge la vidéo sur le stockage, le composant Analyzer collecte des méta-informations et transfère la vidéo vers le composant Worker pour la conversion. Toutes les étapes sont effectuées séquentiellement. Dans ce cas, il peut y avoir plusieurs serveurs d’encodage, mais un seul est occupé à traiter une vidéo spécifique. Diagramme simple et transparent. C'est là que s'arrêtent ses avantages. Ce système ne peut être étendu que verticalement (en raison de l'achat de serveurs plus puissants).

Codage séquentiel avec résultat intermédiaire

Pour atténuer d’une manière ou d’une autre cette attente douloureuse, l’industrie a mis au point une option de codage rapide. Le nom est trompeur, car en fait, le codage complet s’effectue de manière séquentielle et prend tout aussi longtemps. Mais avec un résultat intermédiaire. L’idée est la suivante : préparer et publier une version basse résolution de la vidéo le plus rapidement possible, et ensuite seulement des versions haute résolution.

D'une part, la vidéo devient disponible plus rapidement. Et c'est utile pour les événements importants. Mais d'un autre côté, l'image s'avère floue, ce qui agace les téléspectateurs.

Il s'avère que vous devez non seulement traiter rapidement la vidéo, mais également maintenir sa qualité. C’est désormais ce que les utilisateurs attendent d’un service vidéo. Il peut sembler suffisant d'acheter les serveurs les plus productifs (et de les mettre régulièrement à niveau en même temps). Mais c'est 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 un problème complexe en plusieurs problèmes moins complexes et de les résoudre en parallèle sur différents serveurs. Il s'agit de MapReduce pour la vidéo. Dans ce cas, nous ne sommes pas limités par les performances d'un serveur et pouvons évoluer horizontalement (en ajoutant de nouvelles machines).

À propos, l'idée de diviser des vidéos en petits morceaux, de les traiter en parallèle et de les coller ensemble 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 rend pas les choses globalement plus faciles, car vous ne pouvez pas simplement prendre une solution toute faite et l’intégrer dans votre maison. Nous avons besoin de nous adapter à notre infrastructure, à notre vidéo et même à notre charge. 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.

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

  1. Segmenter divise la vidéo en fragments d'environ 10 secondes. Les fragments sont constitués d'un ou plusieurs GOP (groupe de photos). Chaque GOP est indépendant et codé séparément afin de pouvoir être décodé sans référence aux images des autres GOP. Autrement dit, les fragments peuvent être lus indépendamment les uns des autres. Ce partitionnement réduit la latence, permettant au traitement de commencer plus tôt.
  2. Tcoder traite chaque fragment. Il prend une tâche dans la file d'attente, télécharge un fragment depuis le stockage, l'encode dans différentes résolutions (rappelez-vous que le joueur peut choisir une version en fonction de la vitesse de connexion), puis remet le résultat dans le stockage et marque le fragment comme traité. dans la base de données. Après avoir traité tous les fragments, Tcoder envoie la tâche pour générer des résultats pour le composant suivant.
  3. Combiner rassemble les résultats : télécharge tous les fragments créés par Tcoder, génère des flux pour différentes résolutions.

Quelques mots sur le son. Le codec audio AAC le plus populaire a une fonctionnalité désagréable. Si vous encodez des fragments séparément, vous ne pourrez tout simplement pas les coller ensemble de manière transparente. Les transitions seront perceptibles. Les codecs vidéo n'ont pas ce problème. Théoriquement, vous pouvez rechercher une solution technique complexe, mais ce jeu n'en vaut tout simplement pas encore la chandelle (l'audio pèse nettement moins que la vidéo). Par conséquent, seule la vidéo est codée en parallèle et la totalité de la piste audio est traitée.

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 et sa mise à disposition pour les utilisateurs. Par exemple, auparavant, il fallait deux heures pour créer plusieurs versions complètes de qualité différente pour un film FullHD d'une heure et demie. Maintenant, tout cela prend 15 minutes. De plus, avec le traitement parallèle, nous créons une version haute résolution encore plus rapide qu'une version basse résolution avec l'ancienne approche des résultats intermédiaires.

Et encore une chose. Avec l'ancienne approche, soit il n'y avait pas assez de serveurs, soit ils étaient inactifs sans tâches. Le codage parallèle permet d’augmenter la part du recyclage du fer. Désormais, notre cluster de plus d'un millier de serveurs est toujours occupé avec quelque chose.

En fait, il y a encore place à l’amélioration. Par exemple, nous pouvons gagner un temps considérable si nous commençons à traiter des fragments de la vidéo avant qu’elle ne nous parvienne dans son intégralité. Comme on dit, plus à venir.

Écrivez dans les commentaires quelles tâches dans le domaine du travail avec la vidéo vous aimeriez lire.

Liens utiles vers l'expérience de collègues de l'industrie

Source: habr.com

Ajouter un commentaire