2008-10-19 15 views
25

Tengo imágenes que se envían a mi base de datos desde una fuente de video remota a aproximadamente 5 fotogramas por segundo como imágenes JPEG. Estoy tratando de encontrar la forma de obtener esas imágenes en un formato de video para que pueda transmitir un video en vivo a Silverlight.Creación de una transmisión de video MJPEG en C#

Parece tener sentido crear una secuencia MJPEG pero estoy teniendo algunos problemas. En primer lugar, estaba tratando de transmitir a través de una solicitud HTTP, así que no tuve un acuerdo con los sockets, pero tal vez esto está rompiendo mi código.

Si trato de surf a mi flujo de QT me sale un error de vídeo, reproductor multimedia muestra la primera imagen y Silverlight se estrella :)

Aquí está el código que transmite - desde que tipo de contenido utilizado de esta manera puede solo se enviará una vez que sepa que no es ideal y podría ser la causa raíz. Todas las imágenes están llegando a través de un objeto LINQ2SQL.

Ya intenté simplemente actualizar la fuente de imagen de un control de imagen en Silverlight, pero el parpadeo no es aceptable. Si Silverlight no es compatible con MJPEG, entonces ningún punto continúa, pero parece que sí lo es. Tengo acceso a los marcos h.264 que entran, pero parece más complicado a través de MP4.

Response.Clear(); 
    Response.ContentType = "multipart/x-mixed-replace; boundary=--myboundary"; 
    ASCIIEncoding ae = new ASCIIEncoding(); 
    HCData data = new HCData(); 
    var videos = (from v in data.Videos 
       select v).Take(50); // sample the first 50 frames 
    foreach (Video frame in videos) 
    { 
     byte[] boundary = ae.GetBytes("\r\n--myboundary\r\nContent-Type: image/jpeg\r\nContent-Length:" + frame.VideoData.ToArray().Length + "\r\n\r\n"); 
     var mem = new MemoryStream(boundary); 
     mem.WriteTo(Response.OutputStream); 
     mem = new MemoryStream(frame.VideoData.ToArray()); 
     mem.WriteTo(Response.OutputStream); 
     Response.Flush(); 
     Thread.Sleep(200); 
    } 

¡Gracias!

EDITAR: Tengo la corriente que funciona en firefox así que si navego a la página veo un video! pero nada más acepta el formato. No IE, SL, reproductor de medios, nada.

+0

¿Alguna vez resolvió esto? –

+0

No utilizo este método: terminé cargando imágenes de fondo usando JS en el navegador y luego cambiando las imágenes tan rápido como llegaron. Funcionó bien – typemismatch

+0

Tienes bastante lo básico, hay una implementación aquí @ https://net7mma.codeplex.com/SourceControl/latest – Jay

Respuesta

0

Primero, escriba sus marcos mjpeg en archivos separados. Debería poder abrirlos en Phototshop (esto verificará de manera independiente que está analizando la transmisión correctamente). Si esto falla, apostará a que tiene encabezados HTTP incrustados en sus datos de imagen.

+0

Sí, lo he hecho, las imágenes se usan para otras cosas independientes del video para poder verlas y se ven bien. – typemismatch

+0

¿Eso significa que ha visto los marcos después de que el programa los haya manejado? – junkforce

+0

Sí, también lo tengo funcionando en Firefox y puedo ver el video perfecto, pero sí, también he escrito las imágenes como archivos jpg individuales en el disco y están bien. – typemismatch

0

¿Has visto varias configuraciones de cámaras web que existen en la red? Muchos de ellos hacen algún tipo de actualización de baja resolución sin parpadeo. Debería poder aplicar ingeniería inversa a estos tipos de sitios para obtener pistas adicionales sobre su problema.

Algunos sitios crean una animación GIF, tal vez esa sea una opción para que el usuario pueda ver el minuto pasado más o menos.

1

Estoy lejos de ser un experto en streaming MJPEG, pero mirando la fuente de mjpg-streamer en sourcefourge creo que debe enviar cada fotograma por separado, escribiendo el límite antes y después de cada uno de ellos. Por supuesto, no debe escribir el tipo de contenido en el límite de cierre.

2

Hice MJPEG hace mucho tiempo (hace 3-4 años) y me estoy rascando la cabeza tratando de recordar los detalles y simplemente no puedo. Pero, si es posible, sugeriría encontrar algún tipo de sitio web que transmita contenido MJPEG y disparar wirehark/ethereal y ver lo que pasa por el cable. Supongo que te faltan algunos encabezados HTTP obligatorios que Firefox es un poco más indulgente.

Si no puede encontrar una secuencia MJPEG de muestra a través de Internet, muchas cámaras web tienen un software que le da una secuencia MJPEG. La aplicación con la que trabajé era una consola para múltiples cámaras de seguridad, así que sé que es una implementación común para cámaras de todo tipo (si admiten una interfaz web).

0

Acerca de su edición: MJPEG es compatible con Firefox y Safari. Sin embargo, otras aplicaciones no lo hacen, como Explorer o Silverlight, dependiendo de lo que esté haciendo con él.

Cuestiones relacionadas