HttpWebResponse с MJPEG и multipart/x-mixed-replace; boundary=--myboundary тип содержимого ответа от камеры безопасности не работает

У меня есть ASP.NET приложение, которое мне нужно, чтобы показать видеопоток с камеры безопасности. Видеопоток имеет тип контента "multipart / x-mixed-replace; boundary=--myboundary" с данными изображения между границами. Мне нужна помощь в передаче этого потока данных на мою страницу, чтобы плагин на стороне клиента, который у меня есть, мог потреблять поток так же, как если бы я просматривал веб-интерфейс камеры напрямую. Следующий код не работает:

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

3 ответов


Ну, если вы хотите, чтобы ваш клиент видел поток mjpeg, вам нужно отправить весь http-ответ. HTTP-клиент, такой как браузер или медиаплеер, такой как VLC, нуждается в потоке mjpeg, который выглядит так:

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]

...

Примечание: как Ergousha сказал в ответе, вы должны иметь пустую строку после поля Content-length.

кстати, почему бы не перенаправить клиента непосредственно в поток mjpeg ?

можно использовать http://ipcam/mjpg/video.с mjpg IP ОСИ например, камеры.

Если вам просто нужно Изображение через HTTP, вы должны установить правильный заголовок и тип содержимого MIME image / jpeg. Чтобы декодировать изображение, вы должны получить байтовые данные, и вы получите кодировку jpeg. Тогда вам придется декодировать JPEG, чтобы получить изображение в определенном формате (что-то вроде yuv420p, я думаю). Я проверил свою ip-камеру, и ее поток не закодирован base64, я думаю.

уточните ваши потребности, я попробую помочь больше.

my2c

EDIT:

Ну, я полагаю, вы делаете что-то вроде :

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

чтобы сказать, что вы должны отправить правильный заголовок своему клиенту. Чтобы быть уверенным, используйте такой инструмент, как wireshark, чтобы шпионить за пакетом и убедитесь, что после того, как ваш клиент выдал HTTP, вы отправляете ему правильный поток MJPEG (например, тот, который я описываю в начале моего сообщения ...)

m2c


хорошее объяснение о том, как выглядит поток mjpeg. Я хотел бы добавить совет, что; перед фактическими данными всегда есть 2 новых символа строки. Если вы сделаете это одной строкой, это не сработает.

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

Что такое кодирование данных изображения? Это в base64?

в основном вам придется разобрать данные изображения из ответа, Base64 декодировать его в байты, а затем отправить изображение клиенту.