使用C#在网络中流式传输

时间:2011-08-04 12:59:57

标签: c# .net browser stream

我想问一下如何使用C#将图像流式传输到非本地的客户端。

我们的想法是让来自其他计算机的用户通过在他们的网络浏览器中输入我的电脑的IP来查看来自连接到我的电脑的网络摄像头的图像。

我已成功在本地制作 - 当我在计算机上访问127.0.0.1地址时,它可以正常工作。 我尝试过使用WCF,还尝试使用TcpListener:

listener = new HttpListener();
listener.Start();
HttpListenerContext context = listener.GetContext();
HttpListenerResponse response = context.Response;
System.IO.Stream output = response.OutputStream;
...

但是,当我试图让它从我的本地网络外部工作时 - 我没有。

我的问题是这样的:

- 您是否知道C#中的任何库可以让我轻松地听取请求并通过Stream回答它们? (我试图让浏览器访问我发送给他们的图像流。它可以在本地很好地工作......)

- 也许您知道一种可以简化任务的不同方法吗?

- 除此之外,在尝试向外界广播时,我应该听哪个地址? 127.0.0.1?我在WhatsMyIp网站上看到的地址?

非常感谢!

1 个答案:

答案 0 :(得分:2)

内置网络的网络摄像头通常使用MJPEG/MIME multipart来回传图像。

如果您的相机具有内置网络,那么它很可能已经支持通过网络流式传输MJPEG流。能够从本地网络外部访问摄像机是配置家庭路由器以将外部请求(可能在端口80上)传递到摄像机的IP地址(这称为NAT配置)。这样做的具体过程取决于您的路由器,但配置相当容易。

如果您的相机没有内置网络,您可以在家用计算机上构建一个“代理”,它将侦听来自外部客户端的网络请求,从相机中获取图像,并将图像作为响应中的部分发回流。一旦你编写了代理,就外部访问而言就像网络摄像机一样 - 你需要配置路由器以允许外部访问。

HttpListener是实现代理的不错选择。这里的主要工作是根据MJPEG / MIME多部分约定格式化response.OutputStream。在这里,我建议使用StreamWriter(用于文本部分)和Image.Save用于图像。请记住,MJPEG响应包含MIME / multipart正文中包含的文本数据(用于MIME /多部分标题和边界)和二进制数据(用于实际JPEG图像)的组合。如果您需要同时支持多个客户端的流式传输,您还需要使用线程。

使用HttpListener的IP地址支持+或*表示法,避免需要指定任何IP地址。例如:http://+/Stream/有关详细信息,请参阅MSDN