Gestion / réception de flux webcam vidéo en direct de WebRTC ou de tout mécanisme de capture basé sur le navigateur vers le serveur en utilisant ASP.NET MVC

nous avons besoin de capturer un flux vidéo en direct de WebRTC (ou tout autre mécanisme de capture de la webcam client, même si elle n'est pas prise en charge sur tous les navigateurs, mais comme un PoC).

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

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

recherche d'un mot clé ou d'un lien utile.

nous avons déjà implémenté un moyen d'envoyer des cadres individuels en utilisant base64 jpg, mais ce n'est pas utile du tout, parce qu'il y a un énorme overhead de l'encodage base64 et parce que nous pourrions utiliser n'importe quel encodage vidéo pour envoyer la vidéo plus efficacement (envoyer la différence entre les cadres en utilisant VPx-vp8 - par exemple), la solution requise doit capturer une vidéo à partir de la webcam du client et l'envoyer en direct (non enregistré) au serveur (asp.net) comme un flux-ou des morceaux de données représentant les nouvelles données vidéo-.

16
demandé sur Sawan 2015-08-11 20:49:30

3 réponses

votre question est trop large et le fait de demander des ressources hors site est considéré hors sujet sur stackoverflow. Afin d'éviter les déclarations sujettes à l'opinion, je limiterai la réponse aux concepts généraux.

Flash / RTMP

WebRTC n'est pas encore disponible sur tous les navigateurs, de sorte que le moyen le plus utilisé pour capturer les entrées webcam à partir d'un navigateur actuellement en usage est via un plugin. La solution la plus courante utilise le Adobe Flash Player, si les gens l'aiment ou pas. Cela est dû à l' H.264 support d'encodage dans les versions récentes, avec AAC, MP3 etc. pour l'audio.

Le streaming est accompli à l'aide de la RTMP protocole initialement conçu pour la communication Flash. Le protocole fonctionne sur TCP et a plusieurs saveurs comme l' RTMPS (RTMPTLS/SSL pour le chiffrement), RTMPT (RTMP encapsulé dans HTTP pour firewall traversal).

Le ruisseau d'habitude utilise le FLV format conteneur.

vous pouvez facilement trouver des projets open-source qui utilisent Flash pour capturer les entrées webcam et les diffuser vers un RTMP le serveur.

côté serveur, vous avez deux options:

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

WebRTC

WebRTC vous pouvez soit:

  • enregistrer les petits morceaux de média sur une minuterie et les télécharger sur le serveur où le flux est reconstruit (il faut concaténer et réimprimer les morceaux pour éviter les discontinuités). Voir cette réponse pour les liens.
  • utilisez les fonctions de communication de pair à pair WebRTC avec le serveur étant l'un des pairs.

une solution possible pour le second scénario, que je n'ai pas encore testé personnellement, est proposée par Adam Roach:

  1. Navigateur récupère une page web avec javascript.
  2. le navigateur exécute javascript, qui:
    1. Obtient une poignée de l'appareil photo à l'aide de getUserMedia,
    2. Crée un RTCPeerConnection
    3. appels createOffer et setLocalDescription sur le RTCPeerConnection
    4. Envoie une demande au serveur contenant l'offre (en SDP format)
  3. le serveur traite l'offre SDP et génère sa propre réponse SDP, qui il retourne au navigateur dans sa réponse.
  4. les appels JavaScript setRemoteDescription sur le RTCPeerConnection pour démarrer le média qui coule.
  5. Le serveur commence à recevoir le DTLS/SRTP paquets du navigateur, qu'il n' quoi qu'il en veut, jusqu'à et y compris le stockage dans un format facilement lisible sur un disque dur local.

Source

utiliser VP8 et Vorbis à l'intérieur WebMSRTP (UDP, peut aussi utiliser TCP).

sauf si vous pouvez implémenter RTCPeerConnection directement ASP avec un wrapper vous aurez besoin d'un moyen de transmettre le flux de votre serveur d'application.

PeerConnection API est un puissant fonction de WebRTC. Il est actuellement utilisé par la version WebRTC de Google Hangouts. Vous pouvez lire: comment les Hangouts utilisent WebRTC.

10
répondu aergistal 2017-05-23 10:30:39

Je suis D'accord qu'il s'agit d'une question hors sujet, mais je suis récemment tombé sur la même question/exigence, et ma solution était d'utiliser MultiStreamRecorder de Webrtcexperiences. Cela vous donne essentiellement un "blob" du flux audio/vidéo toutes les X secondes, et vous pouvez télécharger ceci à votre ASP.NET MVC ou contrôleur WebAPI comme démontré ici. Vous pouvez soit traiter en direct les blobs sur la partie serveur par partie, soit les concaténer dans un fichier et puis traiter une fois le stream s'arrête. Notez que les API utilisées dans cette bibliothèque ne sont pas totalement prises en charge dans tous les navigateurs, par exemple il n'y a pas encore de prise en charge iOS.

mon analyse côté serveur demandait à l'utilisateur de parler des phrases complètes, donc en plus j'ai 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 qu'ils aient fini de parler, plutôt que chaque X deuxième.

en ce qui concerne l'obtention d'un délai de 1-2 secondes, je suggérerais de chercher dans les WebSockets pour la livraison, plutôt que le POST HTTP - mais vous devriez jouer avec ces options et choisir le meilleur canal pour vos exigences.

5
répondu Bora B. 2015-08-28 12:39:36

la plupart des caméras IP de nos jours utiliseront L'encodage H264, ou MJPEG. Vous n'êtes pas clair sur ce genre de caméras sont utilisées.

je pense que la vraie question Est, quels sont les composants là-bas pour la création / édition vidéo et quel format vidéo il faut. Une fois que vous savez dans quel format vous devez être, vous pouvez transcoder/transformer votre vidéo en tant que de besoin afin que vous puissiez la gérer du côté du serveur.

il y a un certain nombre de serveurs de médias à transformer / transcoder, et quelque chose comme FFMPEG ou Unreal Media Server peut transformer, décoder, etc côté serveur pour l'obtenir à un format que vous pouvez travailler avec. La plupart des caméras IP que j'ai vues utilisent juste un lecteur de navigateur Web H264.

EDIT: votre plus grand ennemi sera votre retard. 1-2 secondes de retard va être difficile à atteindre.

0
répondu Calvinthesneak 2015-08-26 21:34:47