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-.
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
(RTMP
TLS/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 un
RTMP
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 dansASP
(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:
- Navigateur récupère une page web avec javascript.
- le navigateur exécute javascript, qui:
- Obtient une poignée de l'appareil photo à l'aide de
getUserMedia
,- Crée un
RTCPeerConnection
- appels
createOffer
etsetLocalDescription
sur leRTCPeerConnection
- Envoie une demande au serveur contenant l'offre (en
SDP
format)- le serveur traite l'offre
SDP
et génère sa propre réponseSDP
, qui il retourne au navigateur dans sa réponse.- les appels JavaScript
setRemoteDescription
sur leRTCPeerConnection
pour démarrer le média qui coule.- 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.
utiliser VP8
et Vorbis
à l'intérieur WebM
SRTP
(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.
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.
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.