带有MJPEG和multipart / x-mixed-replace的HttpWebResponse; boundary = - 来自安全摄像头的myboundary响应内容类型不起作用

时间:2010-01-13 22:59:23

标签: c# asp.net httpwebrequest httpwebresponse mjpeg

我有一个ASP.NET应用程序,我需要从安全摄像头显示视频。视频Feed的内容类型为“multipart / x-mixed-replace; boundary = - myboundary'与边界之间的图像数据。我需要帮助将数据流传递到我的页面,以便我拥有的客户端插件可以像使用直接浏览到摄像头的Web界面一样使用流。 以下代码不起作用:

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

3 个答案:

答案 0 :(得分:13)

好吧,如果您希望客户端看到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 AXIS IP摄像机。

如果您只需要通过HTTP获取图像,则必须设置正确的标头和MIME内容类型 图像/ JPEG。要解码图像,您必须获取字节数据,您将获得jpeg编码。然后你将不得不解码jpeg以获得特定格式的图像(我想是yuv420p)。我已经检查了我的ip camera,我认为它的流不是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流(就像我在帖子开头描述的那样......)< / p>

M2C

答案 1 :(得分:3)

关于mjpeg流如何看起来很好的解释。我想补充说明一下; 在实际数据之前总是有2个新行字符。如果你把它做成一行,它就不起作用。

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

答案 2 :(得分:0)

图像数据的编码是什么?是Base64吗?

基本上你必须从响应中解析出图像数据,Base64将其解码为字节,然后将图像发送到客户端。