HttpWebResponse с MJPEG и multipart / x-mixed-replace; border = - тип содержимого моего пограничного ответа с камеры безопасности не работает - PullRequest
7 голосов
/ 14 января 2010

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

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

Ответы [ 3 ]

13 голосов
/ 09 февраля 2010

Что ж, если вы хотите, чтобы ваш клиент видел поток 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.mjpg IP-камеры AXIS.

Если вам просто нужно изображение через HTTP, вы должны установить правильный заголовок и тип содержимого MIME изображение / 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 GET, вы отправите ему правильный поток MJPEG (как тот, который я описал в начале моего сообщения ...) 1023 *

M2C

3 голосов
/ 14 мая 2010

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

        string header =
            "--myboundary\r\n" +
            "Content-Type:image/jpeg\r\n" +
            "Content-Length:" + length.ToString() + "\r\n\r\n";
0 голосов
/ 15 января 2010

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

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

...