web-dev-qa-db-fra.com

Gestion/réception d'un flux de webcam vidéo en direct de WebRTC ou de tout mécanisme de capture basé sur un navigateur au serveur à l'aide d'ASP.NET MVC

Nous devons capturer un flux vidéo en direct depuis WebRTC (ou tout autre mécanisme de capture depuis la webcam du client, même s'il n'est pas pris en charge par tous les navigateurs, mais en tant que PoC).

Cette vidéo en direct doit être gérée par un composant du serveur (ASP.Net MVC/Web API). J'imagine que le code sur le serveur ressemblera à ceci:

[HttpPost]
public ActionResult HandleVideoStream(Stream videoStream)
{
      //Handle the live stream
}

Vous recherchez un mot clé ou un lien utile. 

Nous avons déjà implémenté un moyen d’envoyer des images individuelles en utilisant base64 jpg, mais cela n’est pas du tout utile, car l’encodage en base64 est très lourd et que nous pourrions utiliser tout encodage vidéo pour envoyer la vidéo plus efficacement entre les images utilisant VPx -vp8-, par exemple), la solution requise doit capturer une vidéo de la webcam du client et l'envoyer en direct (non enregistrée) au serveur (asp.net) sous forme de flux - ou de morceaux de données représentant les nouvelles données vidéo-.

18
Sawan

Votre question est trop large et demander des ressources hors site est considéré comme hors sujet sur stackoverflow. Afin d’éviter les affirmations susceptibles de donner lieu à des opinions, je limiterai la réponse aux concepts généraux.

Flash/RTMP

WebRTC n’est pas encore disponible sur tous les navigateurs. La méthode la plus largement utilisée pour capturer les données de la webcam depuis un navigateur actuellement utilisé consiste à utiliser un plugin. La solution la plus courante utilise le Adobe Flash Player , que cela plaise ou non. Cela est dû au support de l'encodage H.264 dans les versions récentes, avec AAC, MP3 etc. pour l'audio. 

La diffusion en continu est réalisée à l'aide du protocole RTMP qui avait été initialement conçu pour la communication Flash. Le protocole fonctionne sur TCP et a plusieurs variantes comme RTMPS (RTMP sur TLS/SSL pour le cryptage), RTMPT (RTMP encapsulée dans HTTP pour le franchissement de pare-feu). 

Le flux utilise généralement le format FLV conteneur.

Vous pouvez facilement trouver des projets open source qui utilisent Flash pour capturer les entrées de la webcam et les diffuser sur un serveur RTMP.

Du côté du serveur, vous avez deux options:

  • implémenter un serveur RTMP de base pour communiquer directement avec la bibliothèque d'envoi et lire le flux
  • utilisez l'un des serveurs RTMP open-source et implémentez un client dans ASP (vous pouvez également transcoder le flux entrant à la volée en fonction de ce que vous essayez de faire avec votre application).

WebRTC

Avec WebRTC, vous pouvez soit:

  • enregistrer de petits morceaux de média sur une minuterie et les télécharger sur le serveur sur lequel le flux est reconstruit (il est nécessaire de concaténer et de re-marquer les morceaux pour éviter les discontinuités). Voir cette réponse pour les liens .
  • utilisez les fonctionnalités de communication d'égal à égal de WebRTC, le serveur étant l'un des homologues.

Adam Roach a proposé une solution pour le deuxième scénario, que je n'ai pas encore testé personnellement.

  1. Le navigateur récupère une page Web contenant du javascript. 
  2. Le navigateur exécute javascript, qui:
    1. Obtient une poignée pour la caméra en utilisant getUserMedia
    2. Crée une RTCPeerConnection
    3. Appelle createOffer et setLocalDescription sur le RTCPeerConnection 
    4. Envoie une demande au serveur contenant l'offre (au format SDP
  3. Le serveur traite l'offre SDP et génère sa propre réponse SDP, qu'il renvoie au navigateur dans sa réponse. 
  4. Les appels JavaScript setRemoteDescription sur RTCPeerConnection pour démarrer les médias qui coule. 
  5. Le serveur commence à recevoir les paquets DTLS/SRTP du navigateur, il fait ensuite ce qu’il veut, jusqu’à stocker dans un format facilement lisible sur un disque dur local.

La source

Ceci utilisera VP8 et Vorbis dans WebM sur SRTP (UDP, peut également utiliser TCP).

Sauf si vous pouvez implémenter RTCPeerConnection directement dans ASP avec un wrapper, vous aurez besoin d'un moyen de transférer le flux vers votre application serveur.

Le PeerConnection API est une fonctionnalité puissante de WebRTC. Il est actuellement utilisé par la version WebRTC de Google Hangouts. Vous pouvez lire: Comment Hangouts utilise-t-il WebRTC .

12
aergistal

D'accord pour dire qu'il s'agit d'une question hors sujet, mais je suis récemment tombé sur le même problème/exigence et ma solution a été d'utiliser MultiStreamRecorder de WebRTCExperiments. En gros, cela vous donne un "blob" du flux audio/vidéo toutes les X secondes et vous pouvez le télécharger sur votre contrôleur ASP.NET MVC ou WebAPI, comme indiqué ici . Vous pouvez soit traiter en temps réel les blobs sur le serveur, soit les concaténer dans un fichier, puis les traiter une fois le flux arrêté. Notez que les API utilisées dans cette bibliothèque ne sont pas entièrement prises en charge par tous les navigateurs. Par exemple, iOS n'est pas encore pris en charge.

Mon analyse côté serveur a demandé à l'utilisateur de dire des phrases complètes, c'est pourquoi j'ai également utilisé PitchDetect.js pour détecter les silences dans le flux audio avant d'envoyer le blob partiel au serveur. Avec ce type de configuration, vous pouvez configurer votre client pour envoyer des blobs partiels au serveur après la fin de la conversation, plutôt que toutes les X secondes.

En ce qui concerne le délai de 1 à 2 secondes, je suggérerais de consulter WebSockets pour la livraison plutôt que HTTP POST - mais vous devriez jouer avec ces options et choisir le meilleur canal pour vos besoins.

5
Bora B.

La plupart des caméras IP de nos jours utiliseront le codage H264, ou MJPEG. Vous ne savez pas quel type de caméras sont utilisées.

Je pense que la vraie question est de savoir quels composants sont disponibles pour la création/édition de vidéos et quel format vidéo est requis. Une fois que vous savez dans quel format vous devez être, pouvez-vous transcoder/transformer votre vidéo si nécessaire pour pouvoir la gérer côté serveur.

Il existe un grand nombre de serveurs de médias à transformer/transcoder et quelque chose du type FFMPEG ou Unreal Media Server peut transformer, décoder, etc. sur le serveur pour obtenir un format compatible. La plupart des caméras IP que j'ai vues utilisent simplement un lecteur de navigateur Web H264.

EDIT: Votre plus grand ennemi va être votre retard. 1-2 secondes de retard vont être difficiles à atteindre.

0
Calvinthesneak