Creando una transmisión de video MJPEG en c#
video-streaming (5)
Tengo imágenes que se envían a mi base de datos desde una fuente de video remota a aproximadamente 5 cuadros 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.
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 intento navegar a mi transmisión desde QT, aparece un error de video, el reproductor multimedia muestra la primera imagen de fotograma y Silverlight se cuelga :)
Aquí está el código que se transmite, ya que el tipo de contenido utilizado de esta manera solo se puede enviar una vez que sé 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 secuencia de trabajo 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.
¿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.
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.
Estoy lejos de ser un experto en streaming MJPEG, pero mirando la fuente de mjpg-streamer en sourcefourge, creo que deberías enviar cada frame 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.
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 muestra de transmisión MJPEG a través de Internet, muchas cámaras web tienen un software que le brinda una transmisión 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).
Primero, escribe tus 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.