c# - experiment - webrtc demo
Manejo/recepción de una transmisión de cámara web de video en vivo desde WebRTC o cualquier mecanismo de captura basado en navegador al servidor mediante ASP.NET MVC (3)
Acepté que esta es una pregunta fuera de tema, pero recientemente me topé con el mismo problema / requisito, y mi solución fue usar MultiStreamRecorder de WebRTCExperiments. Básicamente, esto le da un "blob" de la transmisión de audio / video cada X segundos, y puede cargarlo a su controlador ASP.NET MVC o WebAPI como se muestra here . Puede procesar en vivo los blobs en la parte del servidor por parte, o concatenarlos en un archivo y luego procesarlos una vez que se detiene la secuencia. Tenga en cuenta que las API utilizadas en esta biblioteca no son totalmente compatibles con todos los navegadores, por ejemplo, todavía no hay soporte para iOS.
El análisis del lado del servidor requería que el usuario pronunciara oraciones completas, por lo que además utilicé PitchDetect.js para detectar silencios en la transmisión de audio antes de enviar el blob parcial al servidor. Con este tipo de configuración, puede configurar su cliente para enviar blobs parciales al servidor después de que terminen de hablar, en lugar de cada X segundos.
En cuanto a lograr una demora de 1-2 segundos, sugeriría buscar en WebSockets para la entrega, en lugar de HTTP POST, pero debería jugar con estas opciones y elegir el mejor canal para sus requisitos.
Necesitamos capturar un flujo de video en vivo desde WebRTC (o cualquier otro mecanismo de captura de la cámara web del cliente, incluso si no es compatible con todos los navegadores, pero como PoC).
Este video en vivo debe ser manejado por un componente del servidor (ASP.Net MVC / Web API), me imagino que el código en el servidor se verá así:
[HttpPost]
public ActionResult HandleVideoStream(Stream videoStream)
{
//Handle the live stream
}
Buscando cualquier palabra clave o enlace útil.
Ya hemos implementado una forma de enviar fotogramas individuales usando base64 jpg, pero esto no es útil en absoluto, porque existe una gran sobrecarga de la codificación de base64 y porque podemos usar cualquier codificación de video para enviar el video de manera más eficiente (enviar la diferencia) entre los cuadros usando VPx -vp8- por ejemplo), la solución requerida necesita capturar un video de la cámara web del cliente y enviarlo en vivo (no grabado) al servidor (asp.net) como una secuencia -o trozos de datos representando los nuevos datos de video-.
La mayoría de las cámaras IP en estos días usarán codificación H264 o MJPEG. No está claro qué tipo de cámaras se están utilizando.
Creo que la pregunta real es qué componentes existen para crear / editar videos y qué formato de video requiere. Solo una vez que sepa en qué formato debe estar, puede transcodificar / transformar su video según sea necesario para poder manejarlo en el lado del servidor.
Hay muchos servidores de medios para transformar / transcodificar, y algo como FFMPEG o Unreal Media Server se puede transformar, decodificar, etc. en el lado del servidor para llevarlo a algún formato con el que pueda trabajar. La mayoría de las cámaras IP que he visto solo utilizan un reproductor de navegador basado en web H264.
EDIT: Tu mayor enemigo será tu demora. 1-2 segundos de retraso van a ser difíciles de lograr.
Su pregunta es demasiado amplia y la solicitud de recursos externos se considera fuera de tema en . Para evitar afirmaciones propensas a la opinión, restringiré la respuesta a conceptos generales.
Flash / RTMP
WebRTC
aún no está disponible en todos los navegadores, por lo que la forma más utilizada para capturar la entrada de la cámara web desde un navegador actualmente en uso es a través de un complemento. La solución más común utiliza Adobe Flash Player , le guste o no a la gente. Esto se debe al soporte de codificación H.264
en versiones recientes, junto con AAC
, MP3
, etc. para audio.
La transmisión se realiza utilizando el protocolo RTMP que fue diseñado inicialmente para la comunicación Flash. El protocolo funciona en TCP
y tiene varios sabores como RTMPS
( RTMP
sobre TLS/SSL
para cifrado), RTMPT
( RTMP
encapsulado en HTTP
para el RTMPT
cortafuegos).
La corriente usualmente usa el formato contenedor FLV .
Puede encontrar fácilmente proyectos de código abierto que utilizan Flash para capturar la entrada de la cámara web y transmitirla a un servidor RTMP
.
En el lado del servidor tiene dos opciones:
- implementar un servidor
RTMP
básico para comunicarse directamente con la biblioteca de envío y leer la secuencia - use uno de los servidores
RTMP
código abierto e implemente solo un cliente enASP
(también puede transcodificar el flujo entrante sobre la marcha dependiendo de lo que esté tratando de hacer con su aplicación).
WebRTC
Con WebRTC
puede:
- registre pequeños fragmentos de medios en un temporizador y cárguelos en el servidor donde se reconstruye el flujo (es necesario concatenar y volver a sellar los trozos para evitar discontinuidades). Vea esta respuesta para enlaces .
- use las funciones de comunicación de igual a igual de
WebRTC
con el servidor como uno de los iguales.
Adam Roach ofrece una posible solución para el segundo escenario, que aún no he probado personalmente:
- El navegador recupera una página web con javascript en ella.
- El navegador ejecuta javascript, que:
- Obtiene un controlador para la cámara usando
getUserMedia
,- Crea una
RTCPeerConnection
- Llama a
createOffer
ysetLocalDescription
en laRTCPeerConnection
- Envía una solicitud al servidor que contiene la oferta (en formato
SDP
)- El servidor procesa la oferta
SDP
y genera su propia respuestaSDP
, que devuelve al navegador en su respuesta.- El JavaScript llama a
setRemoteDescription
en laRTCPeerConnection
para iniciar el flujo de medios.- El servidor comienza a recibir paquetes
DTLS/SRTP
desde el navegador, que luego hace lo que quiere, hasta e incluyendo el almacenamiento en un formato fácil de leer en un disco duro local.
Esto usará VP8
y Vorbis
dentro de WebM
sobre SRTP
( UDP
, también puede usar TCP
).
A menos que pueda implementar RTCPeerConnection
directamente en ASP
con un contenedor, necesitará una forma de reenviar la secuencia a su aplicación de servidor.
La PeerConnection API
es una característica poderosa de WebRTC
. Actualmente es utilizado por la versión WebRTC de Google Hangouts. Puedes leer: ¿Cómo utilizan Hangouts WebRTC ?