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

arr*_*.io 7 c# asp.net httpwebrequest mjpeg httpwebresponse

我有一个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;
Run Code Online (Sandbox Code Playgroud)

neu*_*uro 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]

...
Run Code Online (Sandbox Code Playgroud)

注意:正如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
Run Code Online (Sandbox Code Playgroud)

那就是说你必须向你的客户发送正确的标题.为了确保使用像wireshark这样的工具来监视数据包并确保在客户端发出HTTP GET之后你发送给他正确的MJPEG流(就像我在帖子开头描述的那个......)

M2C

  • 它应该是 `boundary=myboundary` 而不是 `boundary=--myboundary`!破折号只能包含在消息正文中,而不应包含在多部分消息的标头中,请参阅 [RFC 1341](http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html)。当解码这样的流时,应该为两者做好准备(正如我刚刚经历的惨痛教训)。 (2认同)

小智 6

很好地解释了 mjpeg 流的样子。我想添加一个提示;在实际数据之前总是有 2 个换行符。如果你把它做成一行,它就不起作用。

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