9

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

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

3 回答 3

16

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

如果您只需要通过 HTTP 获取图像,则必须设置正确的标头和 MIME 内容类型 image/jpeg。要解码图像,您必须获取字节数据,并且您将获得 jpeg 编码。然后你将不得不解码 jpeg 以获得特定格式的图像(我认为类似于 yuv420p)。我检查了我的网络摄像机,我认为它的流不是 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

于 2010-02-09T14:28:09.820 回答
6

很好地解释了 mjpeg 流的外观。我想补充一点;实际数据之前总是有 2 个换行符。如果你把它变成一条线,它就行不通了。

        string header =
            "--myboundary\r\n" +
            "Content-Type:image/jpeg\r\n" +
            "Content-Length:" + length.ToString() + "\r\n\r\n";
于 2010-05-14T07:50:01.120 回答
1

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

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

于 2010-01-14T21:31:23.207 回答