CDN dynamique pour le streaming WebRTC avec faible latence et transcodage


Dans la première partie, nous avons déployé un CDN dynamique simple pour diffuser des flux WebRTC sur deux continents et nous nous sommes assurés que les retards dans un tel CDN sont vraiment faibles, en utilisant le compte à rebours comme exemple.


Cependant, en plus d'une faible latence, il est important de fournir aux téléspectateurs une bonne qualité de diffusion, car ils paient pour cela. Dans la vraie vie, les canaux entre les serveurs Edge et les abonnés peuvent être différents en termes de bande passante et de qualité. Par exemple, nous publions un flux avec une résolution de 720p avec un débit de 2 Mbps, et l'utilisateur le joue sur un smartphone Android en utilisant une connexion 3G dans la zone de réception incertaine du signal, et la résolution maximale à laquelle l'image sera fluide, seulement 360p avec un débit de 400 Mbps .


Les appareils et les navigateurs utilisés par les téléspectateurs sont très différents. Par exemple, nous publions un flux WebRTC en utilisant le codec VP8 à partir du navigateur Chrome sur un PC, et le spectateur lit le flux dans Safari sur l'iPhone, qui ne prend en charge que le codec H264. Ou vice versa, nous publions le flux RTMP depuis OBS Studio, encodant la vidéo en H264 et l'audio en AAC, et le client utilise un navigateur basé sur Chromium, qui ne prend en charge que VP8 ou VP9 pour la vidéo et opus pour le son.


Vous devrez peut-être également améliorer la qualité de la publication originale. Par exemple, nous distribuons le flux de la caméra IP dans une certaine réserve, la plupart du temps l'image est statique, la caméra la donne à une fréquence de 1 image par seconde. En même temps, nous voulons que le spectateur joue 24 images par seconde. Que faire s'il est impossible de remplacer l'appareil photo ou de modifier ses paramètres?


Dans tous ces cas, un transcodage du flux sur le serveur sera nécessaire, c'est-à-dire un décodage de chaque trame reçue et un codage ultérieur avec de nouveaux paramètres. De plus, les paramètres à modifier ne sont souvent connus que du côté client. Voyons comment il est possible de fournir le transcodage en CDN, en équilibrant la qualité de la diffusion et les charges du serveur.


Transcodage: comment, où et pourquoi?


Supposons que nous connaissions les paramètres de flux que le client souhaite recevoir. Par exemple, le spectateur a commencé à lire un flux, et le nombre de pertes de trames dans les statistiques WebRTC nous indique que la résolution et le débit binaire doivent être réduits jusqu'à ce que le client ait changé de chaîne . Dans ce cas, par défaut, le flux sera transcodé sur le serveur Edge auquel la visionneuse est connectée.



Si le client ne prend pas en charge le codec utilisé lors de la publication du flux, vous pouvez affecter le transcodage aux serveurs Edge et Origin.


Cela, et un autre ne peut être qu'une solution temporaire, à condition que la configuration des serveurs Origin et / ou Edge ait été choisie avec une marge. Le transcodage est toujours effectué image par image, il est donc très exigeant en ressources processeur. Ainsi, un cœur de processeur est capable de transcoder un très petit nombre de threads:


AutorisationDébit binaire, KbpsNombre de fils
360p13005
480p18003
720p30002

Même si nous démarrons un processus de transcodage pour tous les abonnés nécessitant les mêmes paramètres de flux multimédia, il est probable que plusieurs téléspectateurs avec des paramètres différents sélectionneront toutes les ressources du serveur.


Ainsi, la bonne solution serait de sélectionner des serveurs spéciaux dans le CDN pour les tâches de transcodage et de choisir la configuration du serveur en fonction de ces tâches.


Ajouter des nœuds de transcodeur à CDN


Ainsi, nous déploierons un serveur dans notre CDN avec le rôle de transcodeur dans les centres de données européens et américains



Configuration des serveurs de transcodeur:


  • Transcoder 1 EU

cdn_enabled=true cdn_ip=t-eu1.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=transcoder 

  • Transcodeur 1 US

 cdn_enabled=true cdn_ip=t-us1.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=transcoder 

Les paramètres de transcodage de flux doivent être décrits sur les serveurs Edge en tant que profils spéciaux dans le fichier cdn_profiles.yml . Par exemple, considérons trois profils par défaut:


  • transcodage en résolution 640x360, 30 images par seconde, une image clé est transmise pour 90 images, codec vidéo H264 utilisant l'encodeur OpenH264, codec audio Opus 48 kHz

 -640x360: audio: codec : opus rate : 48000 video: width : 640 height : 360 gop : 90 fps : 30 codec : h264 codecImpl : OPENH264 

  • transcodage à la résolution 1280x720, codec vidéo H264 utilisant l'encodeur OpenH264, sans transcodage audio

  -720p: video: height : 720 codec : h264 codecImpl : OPENH264 

  • transcodage à une résolution de 1280x720, 30 images par seconde, une image clé est transmise pour toutes les 90 images, débit binaire 2 Mbit / s, codec vidéo H264 utilisant l'encodeur OpenH264, sans transcodage audio

  -720p-2Mbps: video: height : 720 bitrate : 2000 gop : 90 fps : 30 codec : h264 codecImpl : OPENH264 

Nous publions le flux de test avec une résolution de 720p sur le o-eu1 et o-eu1 ce flux sur e-eu1 , en spécifiant le profil dans le nom du flux, par exemple, test-640x360



Le flux est transcodé!


Nous pouvons maintenant décrire un certain nombre de profils sur les serveurs Edge, par exemple, -240p, -360p, -480p, et si du côté client, selon les statistiques WebRTC, un grand nombre de trames perdues sont diagnostiquées, demander automatiquement à nouveau le flux avec une résolution inférieure.


Grouper les nœuds CDN par continent


Maintenant, nos serveurs Transcoder sont égaux. Mais que se passe-t-il si nous voulons transcoder les flux par géographie: pour les téléspectateurs américains en Amérique, pour les téléspectateurs européens en Europe? Soit dit en passant, cela réduira la charge sur les canaux transatlantiques, car dans ce cas, seuls les flux d'origine iront des serveurs Origin EU vers l'Amérique et vice versa, et pas toutes les versions transcodées.



Dans ce cas, dans les paramètres des nœuds du transcodeur, vous devez spécifier le groupe


  • Transcoder 1 EU

 cdn_enabled=true cdn_ip=t-eu1.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=transcoder cdn_groups=EU 

  • Transcodeur 1 US

 cdn_enabled=true cdn_ip=t-us1.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=transcoder cdn_groups=US 

En outre, le groupe doit être ajouté aux paramètres du serveur Edge.


  • Edge 1-2 EU

 cdn_groups=EU 

  • Edge 1-2 US

 cdn_groups=US 

Redémarrez les nœuds avec les nouveaux paramètres. Nous publions le flux de test avec une résolution de 720p sur le o-eu1 , nous o-eu1 ce flux sur e-eu1 avec transcodage



Assurez-vous que le flux est transcodé en t-eu , pour cela, nous ouvrons la page de statistiques http://t-eu1.flashphoner.com:8081/?action=stat et voyons l'encodeur et le décodeur vidéo dans la section Native resources



Dans le même temps, il n'y a pas d'encodeurs vidéo sur t-us1 dans les statistiques



Plus de transcodeurs: équilibrage de charge


Disons que le nombre de téléspectateurs continue de croître et que les capacités d'un serveur Transcoder sur le continent ne sont déjà pas suffisantes. Ok, ajoutez un autre serveur



  • Transcoder 2 EU

 cdn_enabled=true cdn_ip=t-eu2.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=transcoder cdn_groups=EU 

  • Transcodeur 2 US

 cdn_enabled=true cdn_ip=t-us2.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=transcoder cdn_groups=US 

Cependant, nous sommes maintenant confrontés au problème de l'équilibrage de charge entre deux transcodeurs. Afin de ne pas autoriser tous les threads via un seul serveur, nous limiterons la charge moyenne maximale autorisée du processeur sur les nœuds du transcodeur


 cdn_node_load_average_threshold=0.95 

Lorsque la charge moyenne du processeur, divisée par le nombre de cœurs disponibles, atteint cette valeur, le serveur cesse d'accepter les demandes de transcodage de nouveaux threads.


Vous pouvez également limiter le nombre maximal d'encodeurs vidéo fonctionnant simultanément


 cdn_transcoder_video_encoders_threshold=10000 

Lorsque ce montant est atteint, le serveur cessera également d'accepter les demandes de flux de transcodage, même si le chargement du processeur le permet toujours.


Dans tous les cas, le serveur Transcoder continuera à distribuer aux serveurs Edge les flux qui y sont déjà transcodés.


La fin suit


Nous avons donc déployé des serveurs dédiés pour transcoder les flux multimédias dans notre CDN et, ainsi, nous pouvons fournir à nos téléspectateurs une qualité de diffusion en fonction des capacités de leur équipement et de la qualité des chaînes. Cependant, nous n'avons toujours pas abordé la question de la restriction de l'accès aux threads. Nous l'examinerons dans la dernière partie.


Les références


Le CDN de streaming WebRTC à faible latence est un réseau de distribution de contenu basé sur le serveur d'appels Web.

Source: https://habr.com/ru/post/fr477874/


All Articles