erstellen meines eigenen MJPEG-stream
Ich versuche zu schaffen, einen MJPEG-stream, ich habe eine Serie von jpegs, die ich wollen zusammen in einen stream, so dass Benutzer können einfach auf eine URL und bekommen Sie einen mjpeg-stream.
Ich habe versucht, für die letzten paar Tage, um diese zu arbeiten, und es kann eben nicht möglich sein. Ich habe auf gebracht ätherische, und hörte die Pakete kommen von einer Achse Kamera im Netz irgendwo, und versuchte mimmick es. Ich habe ursprünglich versucht, mit Hilfe von WCF und für die Rückgabe einen "stream", aber dann fand später heraus, dass ich brauchen würde, um die Art des Inhalts, auf dem stream, so dass ich dann versucht, den WCF-REST-api, aber leidet unter dem gleichen problem. also ich bin jetzt gerade mit einem nackten Knochen HTTPListener und Handhabung der Veranstaltung. Ich würde es sehr bevorzugen WCF, aber ich bin mir nicht sicher, dass es ermöglichen wird, mich wieder ein stream mit den richtigen content-type.
also hier ist was ich für den httpListener .
in der handler den Hörer rufen Rückseite habe ich die folgenden.
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 wie folgt 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 nur noch ein paar jpeg-Bilder als Eigenschaften auf die dll, und bin zu iterieren über Sie, schließlich werden diese dynamischen Bilder, aber für jetzt, ich will einfach nur, um die Sache zu arbeiten.
Von dem, was ich verstehe, über das MJPEG (spec) ist, dass der Inhalt muss auf " multipart/x-mixed-replace und eine Grenze gesetzt. und dann hat man nur deliminate die JPEG-Bilder in den stream von die Grenze.
Dieser scheint, wie es sollte einfacher sein, dann mache ich es, aber ich Frage mich, wohin ich gehe falsch. wenn ich laden Sie diese URL im IE oder Firefox, es hängt nur. wenn ich versuche, ein stub-html-Seite mit einem img-tag, dessen Quelle die URL bekomme ich dann unterbrochenes Bild.
Irgendwelche Ideen, danke
Josh
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, soweit ich sagen kann, hier sind Ihre Fragen:
Den
StreamWriter
ist nicht die richtige Wahl. Verwenden Sie einen regelmäßigen stream-write-Funktion ist in Ordnung. Das bedeutet, Sie sollten das schreiben von Daten im Byte-array statt string.Wandeln Sie die Binären Daten des Bildes zu String64, der browser nicht bekannt ist, die immer noch denken, es ist 32bit Daten.
Ihre jpeg-frame-format ist nicht korrekt. Sollten Sie auch hinzufügen
Content-Length
auf den frame-header, so dass die Anwendung, die den stream empfangen zu können, wissen, Wann Sie aufhören zu Lesen, anstatt zu prüfen, für die nächsten boundary-string alle Lesen. Dies wird in etwa 4-5 mal schneller in die Daten zu Lesen. Und es gibt auch eine Inkonsistenz in Ihrer neue-Zeile-Zeichen, einige sind "\r\n", während einige andere sind "\n".While-Schleife ist eine Endlosschleife.
So, hier ist die Lösung.
Hinweis: möglicherweise gibt Es einige syntax-Fehler, aber Sie wahrscheinlich bekommen die Allgemeine Idee.
Gibt es auch eine Umsetzung @ https://net7mma.codeplex.com/SourceControl/latest der Bibliothek gibt, kann transcode-Http-Rtp-kompatible on-the-fly!