Avec Chrome désactivant Flash par défaut très bientôt, je dois commencer à chercher des solutions de remplacement Flash/RTMP html5.
Actuellement, avec Flash + RTMP, j'ai un flux vidéo en direct avec un délai de <1-2 secondes.
J'ai expérimenté MPEG-DASH, qui semble être la nouvelle norme de l'industrie en matière de diffusion en continu, mais avec 5 secondes de retard, c'est le meilleur temps que je puisse en tirer.
Pour le contexte, j'essaie de permettre à l'utilisateur de contrôler les objets physiques qu'il peut voir sur le flux, de sorte que tout dépassement de quelques secondes de retard entraîne une expérience frustrante.
Existe-t-il d'autres techniques ou n'existe-t-il pas encore de solutions html5 à faible temps de latence pour la diffusion en direct?
WebRTC est le seul ensemble technologique basé sur le Web qui soit réellement orienté vers une faible latence. Il est construit pour la vidéoconférence. Les codecs sont ajustés pour une faible latence sur la qualité. Les débits binaires sont généralement variables, optant pour une connexion stable sur la qualité.
Cependant, vous n'avez pas nécessairement besoin de cette optimisation à faible latence pour tous vos utilisateurs. En fait, d'après ce que je peux comprendre de vos besoins, une faible latence pour tout le monde nuira à l'expérience utilisateur. Alors que vos utilisateurs qui contrôlent le robot ont définitivement besoin de la vidéo à faible temps de latence pour pouvoir le contrôler de manière raisonnable, les utilisateurs qui ne le contrôlent pas n’ont pas cette exigence et peuvent au contraire opter pour une vidéo fiable de qualité supérieure.
Les utilisateurs contrôlant le robot chargeront une page utilisant certains composants WebRTC pour se connecter à la caméra et au serveur de contrôle. Pour faciliter les connexions WebRTC, vous avez besoin d’une sorte de serveur STUN. Pour contourner NAT et d’autres restrictions de pare-feu, vous aurez peut-être besoin d’un serveur TURN. Ces deux éléments sont généralement intégrés aux frameworks WebRTC basés sur Node.js.
Le serveur de caméra/contrôle devra également se connecter via WebRTC. Honnêtement, le moyen le plus simple de le faire est de rendre votre application de contrôle quelque peu basée sur le Web. Puisque vous utilisez déjà Node.js, consultez NW.js ou Electron . Tous deux peuvent tirer parti des fonctionnalités WebRTC déjà intégrées à WebKit, tout en vous laissant la possibilité de faire ce que vous voulez avec Node.js.
Les utilisateurs sous contrôle et le serveur de cames/contrôle établissent une connexion entre homologues via WebRTC (ou le serveur TURN si nécessaire). À partir de là, vous souhaiterez ouvrir un canal multimédia ainsi qu'un canal de données. Le côté données peut être utilisé pour envoyer des commandes à votre robot. Le canal multimédia sera bien sûr utilisé pour le flux vidéo à faible latence renvoyé aux utilisateurs sous contrôle.
Encore une fois, il est important de noter que la vidéo qui sera renvoyée sera optimisée pour la latence, pas pour la qualité. Ce type de connexion assure également une réponse rapide à vos commandes.
Les utilisateurs qui visualisent simplement le flux et ne contrôlent pas le robot peuvent utiliser les méthodes de distribution vidéo normales. En fait, il est très important que vous utilisiez un CDN existant et des services de transcodage, car vous aurez 10 000 à 15 000 personnes qui regardent le flux. Avec autant d'utilisateurs, vous allez probablement vouloir votre vidéo dans deux codecs différents, et certainement dans toute une gamme de débits binaires. La distribution avec DASH ou HLS est plus facile à utiliser pour le moment et vous libère des exigences relatives à Flash.
Vous voudrez probablement aussi envoyer votre flux vers des services de médias sociaux. C'est une autre raison pour laquelle il est important de commencer avec un flux HD de haute qualité. Ces services transcoderont à nouveau votre vidéo, ce qui réduira la qualité. Si vous commencez d'abord par une bonne qualité, vous obtiendrez finalement une meilleure qualité.
Le type de métadonnées dont vous avez besoin n’est pas clairement défini dans vos besoins, mais vous pouvez utiliser une bibliothèque de socket Web, telle que Socket.IO, pour les petites données reposant sur des messages. Lorsque vous augmentez ce nombre à quelques reprises, vous pouvez utiliser pub/sub, tel que Redis , pour la distribution des messages sur les serveurs.
Pour synchroniser les métadonnées sur la vidéo, cela dépend un peu du contenu de ces métadonnées et des exigences de synchronisation, en particulier. De manière générale, vous pouvez supposer qu'il y aura un délai raisonnable mais imprévisible entre la vidéo source et les clients. Après tout, vous ne pouvez pas contrôler la durée de la mise en mémoire tampon. Chaque appareil est différent, chaque variable de connexion. Ce que vous pouvez supposer, c'est que la lecture commence par le premier segment téléchargé par le client. En d'autres termes, si un client commence à mettre en mémoire tampon une vidéo et commence à la lire 2 secondes plus tard, la vidéo a 2 secondes de retard par rapport à la première demande.
La détection du moment où la lecture commence réellement est possible côté client. Comme le serveur connaît l'horodatage pour lequel la vidéo a été envoyée au client, il peut informer le client de son décalage par rapport au début de la lecture de la vidéo. Étant donné que vous utiliserez probablement DASH ou HLS et que vous devez utiliser MCE avec AJAX pour obtenir les données, vous pouvez utiliser les en-têtes de réponse dans la réponse du segment pour indiquer l'horodatage du début segment. Le client peut alors se synchroniser. Permettez-moi de vous expliquer cela étape par étape:
Date:
peut indiquer la date et l'heure exactes du début du segment.Date:
(disons 2016-06-01 20:31:00
). Le client continue à mettre les segments en mémoire tampon.00:00:00
sur le lecteur vidéo est actuellement 2016-06-01 20:31:00
.Pourquoi pas [technologie-magique-ici]?.
There are tradeoffs in every approach. I think what I have outlined here separates the concerns and gives you the best tradeoffs in each area. Please feel free to ask for clarification or ask follow-up questions in the comments.
Ce n'est pas encore prêt (espérons-le, deuxième semestre de cette année), mais/ Protocoles basés sur HTTP Full Duplex vous permettra d'utiliser MPEG DASH sur des Websockets, offrant ainsi les avantages de DASH (open source, ABR, compatibilité ...), ainsi que la faible latence d'autres formats (par exemple, WebRTC, qui ne fonctionne pas sur safari btw ).
Donc, si vous envisagez un format vidéo à faible latence dans quelques mois, essayez de regarder pour cela.
Optez pour WebRTC, car:
WebRTC est une norme qui prend en charge la communication en temps réel basée sur un navigateur. Développé à l'origine par Google, le standard est maintenant géré par le W3C. WebRTC permet aux applications de navigateur à navigateur pour les appels vocaux, le chat vidéo et le partage de fichiers sans recourir à des plug-ins externes, autres qu'un navigateur compatible.
Avantages :
WebRTC Test.