2010-01-13 8 views
6

Ho un'applicazione ASP.NET che mi serve per mostrare un feed video da una telecamera di sicurezza. Il feed video ha un tipo di contenuto di 'multipart/x-mixed-replace; boundary = - myboundary 'con i dati dell'immagine tra i confini. Ho bisogno di assistenza per passare questo flusso di dati attraverso la mia pagina in modo che il plug-in lato client che ho può consumare il flusso proprio come farebbe se sfoglia direttamente l'interfaccia web della fotocamera. Il seguente codice non funziona:HttpWebResponse con MJPEG e multipart/x-mixed-replace; boundary = - tipo di contenuto risposta myboundary da telecamera di sicurezza non funzionante

//Get response data 
byte[] data = HtmlParser.GetByteArrayFromStream(response.GetResponseStream()); 
if (data != null) 
{ 
HttpContext.Current.Response.OutputStream.Write(data, 0, data.Length); 
} 
return; 

risposta

12

Bene, se si desidera che il client visualizzi il flusso mjpeg, è necessario inviare l'intera risposta http. client HTTP come browser o media player come VLC ha bisogno di un flusso MJPEG che assomiglia a:

HTTP/1.1 200 OK 
Content-Type: multipart/x-mixed-replace; boundary=myboundary 

--myboundary 
Content-Type: image/jpeg 
Content-length: 12345 

[image 1 encoded jpeg data] 


--myboundary 
Content-Type: image/jpeg 
Content-length: 45678 

[image 2 encoded jpeg data] 

... 

NOTA: Come ha detto Ergousha in una risposta, è necessario disporre di una riga vuota dopo il campo Content-length.

A proposito, perché non reindirizzare il client direttamente al flusso mjpeg?

È possibile utilizzare le telecamere IP AXIS http://ipcam/mjpg/video.mjpg ad esempio.

Se è sufficiente l'immagine tramite HTTP, è necessario impostare l'intestazione corretta e il tipo di contenuto MIME image/jpeg. Per decodificare l'immagine, devi ottenere i dati di byte e otterrai la codifica jpeg. Quindi dovrai decodificare jpeg per ottenere un'immagine in un formato specifico (come penso a yuv420p). Ho controllato la mia telecamera IP, e il suo stream non è codificato in Base64, penso.

Precisi i vostri bisogni, cercherò di aiutare di più.

MY2C

EDIT:

Bene, suppongo che si fa qualcosa di simile:

client : connect to proxy, 
      get example.com/camera1.mjpg, 
      while not the end 
       recv 


yourproxy : wait connection 
      connect to camera, 
      get 10.0.0.123/camera1.mjpg 
      while not the end 
       recv buffer 
       copy buffer 
       send buffer to client 

Questo per dire che è necessario inviare l'intestazione corretta per il vostro cliente. Per essere sicuri di utilizzare uno strumento come wireshark per spiare il pacchetto ed essere sicuri che dopo che il client ha emesso un HTTP GET gli mandi il flusso MJPEG corretto (come quello che descrivo all'inizio del mio post ...)

m2c

+0

è esattamente quello che voglio fare. Non riesco a reindirizzare l'utente direttamente al flusso mjpeg poiché la mia applicazione funziona come proxy inverso. Quindi ho bisogno di ricevere il flusso dalla fotocamera, quindi inviarlo come risposta a un URL nella mia applicazione. Quindi il client HTTP chiama http://example.com/camera1.mjpg il mio server analizza la richiesta e chiama camera1 a http://10.1.1.240/mjpg/video.mjpg Ho quindi bisogno di trasmettere la risposta al client. Quindi questo è dove ho avuto difficoltà a capire come eseguire lo streaming della mjpg sul client non modificato. –

+0

Sii più preciso sulle tue difficoltà. Osservando il tuo snippet di codice, sembra che tu abbia letto solo parte della risposta. Con HTTP/MJPEG devi leggere continuamente i pacchetti TCP e rinviarli, quindi lo pseudo codice nella mia risposta. Suppongo che la chiamata a GetByteArrayFromStream legga parzialmente i dati, quindi rispedisci al tuo cliente solo dati parziali. Devi leggere sul canale TCP fino a quando non si chiude! Controlla quello che ricevi/quello che mandi con wireshark, avrai verità di fondo. Se fraintendiamo il tuo problema, preciso, per favore ... – neuro

+0

Sì, sono abbastanza sicuro che avremo bisogno di andare un po 'più a fondo e usare qualcosa di meno astratto come 'TcpClient'. Attualmente sto cercando di fare la stessa cosa di @arri.me! –

0

Qual è la codifica dei dati di immagine? È Base64?

Fondamentalmente dovrete analizzare i dati dell'immagine dalla risposta, Base64 decodificarlo in byte e quindi inviare l'immagine al client.

+0

No, come lo streaming deve essere inoltrato come mjpeg al client. non c'è bisogno di decodificare/codificare :) – neuro

3

Buona spiegazione su come il flusso mjpeg è simile. Vorrei aggiungere un suggerimento; ci sono sempre 2 caratteri di nuova riga prima dei dati effettivi. Se lo fai una riga, non funziona.

 string header = 
      "--myboundary\r\n" + 
      "Content-Type:image/jpeg\r\n" + 
      "Content-Length:" + length.ToString() + "\r\n\r\n"; 
+0

Grazie e buona precisione. Aggiungerò che ... – neuro