2010-01-13 13 views
6

Tengo una aplicación de ASP.NET que necesito para mostrar un video de una cámara de seguridad. La transmisión de video tiene un tipo de contenido de 'multipart/x-mixed-replace; boundary = - myboundary 'con los datos de imagen entre los límites. Necesito ayuda para pasar ese flujo de datos a mi página para que el complemento del lado del cliente que tengo pueda consumir la transmisión de la misma forma que lo haría si navegara directamente a la interfaz web de la cámara. El código siguiente no funciona:HttpWebResponse con MJPEG y multipart/x-mixed-replace; boundary = - tipo de contenido de respuesta de myboundary de la cámara de seguridad no funciona

//Get response data 
byte[] data = HtmlParser.GetByteArrayFromStream(response.GetResponseStream()); 
if (data != null) 
{ 
HttpContext.Current.Response.OutputStream.Write(data, 0, data.Length); 
} 
return; 

Respuesta

12

Bueno, si quiere que su cliente vea el flujo de mjpeg, debe enviar toda la respuesta http. cliente HTTP como el navegador o reproductor multimedia como VLC necesita un flujo MJPEG que parece:

HTTP/1.1 200 OK 
Content-Type: multipart/x-mixed-replace; boundary=myboundary 

--myboundary 
Content-Type: image/jpeg 
Content-length: 12345 

[image 1 encoded jpeg data] 


--myboundary 
Content-Type: image/jpeg 
Content-length: 45678 

[image 2 encoded jpeg data] 

... 

NOTA: Como dijo Ergousha en una respuesta, debe tener una línea en blanco después de que el campo Content-Length.

Por cierto, ¿por qué no redirigir a su cliente directamente al flujo de mjpeg?

Puede usar cámaras IP AXIS de http://ipcam/mjpg/video.mjpg por ejemplo.

Si solo necesita la imagen a través de HTTP, debe establecer el encabezado correcto y el tipo de contenido MIME image/jpeg. Para decodificar la imagen, debe obtener los datos de bytes y obtendrá la codificación jpeg. Luego tendrá que decodificar jpeg para obtener una imagen en un formato específico (algo así como yuv420p, creo). Revisé mi cámara ip y creo que su transmisión no está codificada en base64.

Precise sus necesidades, intentaré ayudar más.

MY2C

EDIT:

Bueno, supongo que hacer algo como:

client : connect to proxy, 
      get example.com/camera1.mjpg, 
      while not the end 
       recv 


yourproxy : wait connection 
      connect to camera, 
      get 10.0.0.123/camera1.mjpg 
      while not the end 
       recv buffer 
       copy buffer 
       send buffer to client 

Eso quiere decir que usted debe enviar la cabecera correcta para su cliente. Para estar seguro, utilice una herramienta como wireshark para espiar el paquete y asegúrese de que después de que su cliente haya emitido un HTTP GET, le envíe la secuencia correcta de MJPEG (como la que describo al comienzo de mi publicación ...)

m2c

+0

eso es exactamente lo que quiero hacer. No puedo redirigir al usuario directamente a la secuencia de mjpeg ya que mi aplicación funciona como un proxy inverso. Entonces necesito recibir la transmisión de la cámara y luego enviarla como respuesta a una URL en mi aplicación. Entonces el cliente HTTP llama a http://example.com/camera1.mjpg mi servidor analiza la solicitud y llama a camera1 en http://10.1.1.240/mjpg/video.mjpg Luego necesito transmitir la respuesta al cliente. Así que aquí es donde he estado teniendo dificultades para averiguar cómo volver a transmitir el mjpg al cliente sin modificaciones. –

+0

Sea más preciso acerca de sus dificultades. Al mirar el fragmento de código, parece que solo lees parte de la respuesta. Con HTTP/MJPEG tiene que leer continuamente los paquetes TCP y volver a enviarlos, de ahí el pseudo código en mi respuesta. Supongo que la llamada GetByteArrayFromStream leyó parcialmente los datos, por lo que devuelve a su cliente solo datos parciales. ¡Tienes que leer en el canal TCP hasta que se cierre! Comprueba lo que recibes/lo que envías con wireshark, tendrás la verdad sobre el terreno. Si no entiendo bien su problema, precisalo, por favor ... – neuro

+0

Sí, estoy bastante seguro de que tendremos que profundizar un poco más y usar algo menos abstracto como 'TcpClient'. ¡Actualmente estoy tratando de hacer lo mismo que @ arri.me! –

0

¿Cuál es la codificación de los datos de imagen? ¿Es Base64?

Básicamente deberá analizar los datos de imagen de la respuesta, Base64 decodificarlos en bytes y luego enviar la imagen al cliente.

+0

No, ya que la transmisión se debe enviar como mjpeg al cliente. no es necesario decodificar/codificar :) – neuro

3

Buena explicación sobre cómo se ve la secuencia de mjpeg. Me gustaría agregar un consejo que; siempre hay 2 caracteres de línea nuevos antes de los datos reales. Si lo haces una línea, no funciona.

 string header = 
      "--myboundary\r\n" + 
      "Content-Type:image/jpeg\r\n" + 
      "Content-Length:" + length.ToString() + "\r\n\r\n"; 
+0

Gracias y buena precisión. Añadiré que ... – neuro

Cuestiones relacionadas