Web : HTTP-FLV
Description
Le premier client pour lequel on implémente l'émission et la réception de flux est le client web.
On utilise MediaRecorder pour récupérer caméra et microphone depuis le navigateur. Ces données sont ensuite envoyées brutes, par paquet, à l'API Média. Celle-ci les converti en flux RTMP à l'aide d'Ffmpeg, qu'elle envoie au média serveur. Node-Media-Server reçoit le flux RTMP, le rediffuse et le rend accessible avec HTTP-FLV, méthode de récupération de média via HTTP.
Configuration de Ffmpeg via Node-Media-Server pour la réception des flux RTMP :
const config = {
logType: 3,
rtmp: {
port: RtmpPort,
chunk_size: 500,
gop_cache: true,
ping: 30,
ping_timeout: 60
},
http: {
port: HttpPort,
allow_origin: '*',
mediaroot: './media'
},
}
Sans détailler les échanges, lorsqu'un utilisateur partage un flux, il transmet aux autres les informations nécessaires pour le récupérer sur le serveur média. Les utilistateurs web récupèrent les flux vidéo avec HTTP-FLV et les affichent avec un élément vidéo HMTL5. A noter qu'à cette heure, nous ne nous sommes pas concentrés sur l'audio. Mais RTMP, HTTP-FLV et HTML5 supportent l'audio synchronisé, nous devrions pouvoir l'intégrer sans difficulté. C'est l'étape suivante côté web.
Difficultés
Certains modules du client web nécessite de pré-traiter le flux vidéo. C'est le cas du BackgroundRemoval, qui consiste à isoler la silhouette de l'utilisateur dans l'image à l'aide d'un modèle d'IA.
Nous n'avons pas trouvé de manière élégante de réaliser ce pré-traitement. Nous sommes forcés de diffuser une première fois la vidéo en local sur un canvas puis d'utiliser chaque image ainsi diffusée comme entrée pour notre processus de traitement. C'est à la sortie de ce processus qu'on capture et envoie les données en RTMP.
Le traitement ajoute un délai et de l'inconsistence au flux sortant, cela n'empêche pas la rediffusion par le média serveur mais la lecture par d'autres clients est de qualité très variable.
Résultats : Emission et réception
On observe une latence d'environ 5 secondes entre utilisateurs web. Or incident, il n'y a pas de défaut visuel ni de perte à signaler.