tworzenie własnego strumienia MJPEG
Próbuję utworzyć strumień MJPEG, mam serię jpeg, które chcę połączyć w strumień, aby użytkownik mógł po prostu nacisnąć URL i pobrać strumień mjpeg. Od kilku dni staram się, żeby to zadziałało i może to nie być możliwe. Podniosłem eteryczność i słuchałem pakietów pochodzących z kamery osiowej gdzieś w sieci i próbowałem sobie z tym poradzić. Początkowo próbowałem używać WCF i zwracałem „strumień”, ale później dowiedziałem się, że będę musiał ustawić typ zawartości w tym strumieniu, więc spróbowałem api WCF REST, ale ten problem jest taki sam. więc używam tylko nagich kości HTTPListener i obsługuję zdarzenie. Wolałbym używać WCF, ale nie jestem pewien, czy pozwoli mi to zwrócić strumień o odpowiednim typie zawartości. więc oto co mam dla httpListener.
w obsłudze oddzwonienia słuchacza umieściłem następujące.
HttpListenerResponse response = context.Response;
response.ProtocolVersion = new System.Version(1, 0);
response.StatusCode = 200;
response.StatusDescription = "OK";
response.ContentType = "multipart/x-mixed-replace;boundary=" + BOUNDARY + "\r\n";
System.IO.Stream output = response.OutputStream;
Render(output);
metoda Render wygląda tak
var writer = new StreamWriter(st);
writer.Write("--" + BOUNDARY + "\r\n");
while (true)
{
for (int i = 0; i < imageset.Length; i++)
{
var resource = Properties.Resources.ResourceManager.GetObject(imageset[i]) as Bitmap;
var memStream = new MemoryStream();
resource.Save(memStream,ImageFormat.Jpeg);
byte[] imgBinaryData = memStream.ToArray();
string s = Convert.ToBase64String(imgBinaryData);
writer.Write("Content-type: image/jpeg\r\n");
foreach (var s1 in imgBinaryData)
{
writer.Write((char)s1);
}
writer.Write("\n--" + BOUNDARY + "\n");
writer.Flush();
Thread.Sleep(500);
}
}
W tym momencie właśnie dodałem kilka obrazów jpeg jako właściwości do biblioteki dll i iteruję nad nimi, w końcu będą to obrazy dynamiczne, ale na razie chcę tylko, żeby to działało.
Z tego co rozumiem w MJPEG (spec) jest to, że treść musi być ustawiona na multipart / x-mixed-replace i zestaw granic. a następnie po prostu ograniczasz jpeg w strumieniu o granicę.
Wygląda na to, że powinno być prostsze niż ja, ale zastanawiam się, gdzie się mylę. jeśli załaduję ten adres URL w IE lub Firefox, po prostu się zawiesza. jeśli spróbuję utworzyć stronę stub html ze znacznikiem img, którego źródłem jest adres URL, otrzymam uszkodzony obraz.
Wszelkie pomysły, dzięki
Josh