我有一个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;
答案 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将其解码为字节,然后将图像发送到客户端。