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

questionAnswers(2)

yourAnswerToTheQuestion