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-.
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:
RTMP
de base pour communiquer directement avec la bibliothèque d'envoi et lire le fluxRTMP
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:
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.
- Le navigateur récupère une page Web contenant du javascript.
- Le navigateur exécute javascript, qui:
- Obtient une poignée pour la caméra en utilisant
getUserMedia
,- Crée une
RTCPeerConnection
- Appelle
createOffer
etsetLocalDescription
sur leRTCPeerConnection
- Envoie une demande au serveur contenant l'offre (au format
SDP
)- Le serveur traite l'offre
SDP
et génère sa propre réponseSDP
, qu'il renvoie au navigateur dans sa réponse.- Les appels JavaScript
setRemoteDescription
surRTCPeerConnection
pour démarrer les médias qui coule.- 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.
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 .
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.
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.