HttpWebResponse с MJPEG и multipart/x-mixed-replace; boundary=--myboundary response content type from security camera not working



У меня есть 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;
910   3  

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]

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

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

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

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

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

My2c

Правка:

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

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 GET, вы отправляете ему правильный поток 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 декодирует их в байты, а затем отправить изображение клиенту.

Comments

    Ничего не найдено.