Sto provando a creare un flusso MJPEG, ho una serie di jpeg che voglio mettere insieme in uno stream in modo che un utente possa semplicemente premere un URL e ottenere un flusso mjpeg. Ho cercato per gli ultimi giorni di farlo funzionare, e potrebbe non essere possibile. Ho sollevato l'etereo e ho ascoltato i pacchetti provenienti da una telecamera dell'asse sulla rete da qualche parte, e ho cercato di schivarlo. Inizialmente ho provato a usare WCF e restituire uno "stream", ma in seguito ho scoperto che avrei dovuto impostare il tipo di contenuto su quel flusso, quindi ho provato l'API di WCF REST, ma questo ha lo stesso problema. quindi ora sto solo usando un HTTPListener nudo e gestendo l'evento. Preferisco di gran lunga utilizzare WCF, ma non sono sicuro che mi consentirà di restituire un flusso con il giusto tipo di contenuto. ecco cosa ho per httpListener.creazione del mio stream MJPEG
nel gestore della chiamata listener ho messo quanto segue.
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);
il metodo Render assomiglia a questo
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);
}
}
A questo punto ho aggiunto un paio di immagini JPEG come proprietà sul dll, e sto iterazione su di loro, alla fine questi saranno immagini dinamiche , ma per ora voglio solo far funzionare la cosa.
Da quello che ho capito sul MJPEG (spec) è che il contenuto deve essere impostato su multipart/x-mixed-replace e un set di limiti. e quindi basta eliminare i jpeg all'interno del flusso dal confine.
Sembra che dovrebbe essere più semplice di quello che sto facendo, ma mi chiedo dove sto andando male. se carico questo URL su IE o Firefox, si blocca. se provo a creare una pagina stub html con un tag img, la cui origine è l'URL, ricevo un'immagine spezzata.
tutte le idee, grazie
Josh
Mi rendo conto che questo ha più di un anno ... ma ancora. Le specifiche dicono che dovrebbe esserci uno spazio singolo ('', ASCII 32) tra i due punti dopo il nome dell'intestazione 'e il valore dell'intestazione. –