Erstellen meines eigenen MJPEG-Streams

Ich versuche, einen MJPEG-Stream zu erstellen. Ich habe eine Reihe von JPEG-Dateien, die ich zu einem Stream zusammenfügen möchte, damit ein Benutzer einfach auf eine URL klicken und einen MJPEG-Stream abrufen kann. Ich habe in den letzten Tagen versucht, dies zum Laufen zu bringen, und es ist möglicherweise einfach nicht möglich. Ich habe ätherische Dinge angesprochen und mir die Pakete angehört, die irgendwo von einer Achsenkamera im Netz kommen, und versucht, sie nachzuahmen. Ursprünglich habe ich versucht, WCF zu verwenden und einen "Stream" zurückzugeben, später jedoch festgestellt, dass ich den Inhaltstyp für diesen Stream festlegen muss. Daher habe ich dann die WCF-REST-API versucht, die jedoch unter demselben Problem leidet. Daher verwende ich jetzt nur einen Bare-Bones-HTTPListener und behandle das Ereignis. Ich würde sehr gerne WCF verwenden, bin mir aber nicht sicher, ob ich damit einen Stream mit dem richtigen Inhaltstyp zurückgeben kann. also hier ist was ich für den httpListener habe.

im handler des hörerrückrufs habe ich folgendes gesetzt.

        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);

Die Render-Methode sieht so aus

        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);
            }
        }

Zu diesem Zeitpunkt habe ich gerade ein paar JPEG-Bilder als Eigenschaften in die DLL eingefügt und iteriere darüber. Letztendlich handelt es sich um dynamische Bilder, aber jetzt möchte ich nur, dass das Ding funktioniert.

Was ich über das MJPEG (spec) verstehe, ist, dass der Inhalt auf multipart / x-mixed-replace und einen Grenzsatz gesetzt werden muss. und dann werden die JPEGs innerhalb des Streams nur durch die Grenze getrennt.

Das scheint einfacher zu sein, als ich es mache, aber ich frage mich, wo ich falsch liege. Wenn ich diese URL in IE oder Firefox lade, hängt sie nur. Wenn ich versuche, eine Stub-HTML-Seite mit einem img-Tag zu erstellen, dessen Quelle die URL ist, erhalte ich ein fehlerhaftes Bild.

Irgendwelche Ideen, danke

Josh

Antworten auf die Frage(2)

Ihre Antwort auf die Frage