将无限的IP Camera流保存到文件中

时间:2012-10-01 11:42:22

标签: c# video-capture

我正在开发一个网络项目,用户必须能够使用IP摄像头(Mobotix摄像头)录制视频。我想出了几个想法,但没有一个真的奏效。因为我无法在客户端PC上安装任何软件,所以我想出了将记录保存在服务器上的想法。因此,用户在他的浏览器中打开一个页面,并且在请求中,服务器向摄像机打开请求(使用摄像机通过HTTP提供的内置流:http:///cgi-bin/faststream.jpg? stream = full& fps = 1.0),并使用以下代码将流保存到服务器:

   public ActionResult Index()
   {

        WebClient webClient = new WebClient();
        webClient.Credentials = new NetworkCredential("Username", "Password");

        var url = "http://<ip-camera>/cgi-bin/faststream.jpg?params";

        // Download the file and write it to disk
        using (Stream webStream = webClient.OpenRead(url))
        using (FileStream fileStream = new FileStream(outputFile, FileMode.Create))
        {
            var buffer = new byte[32768];
            int bytesRead;
            Int64 bytesReadComplete = 0;  // Use Int64 for files larger than 2 gb

            // Get the size of the file to download
            Int64 bytesTotal = Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]);

            // Download file in chunks
            while ((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                bytesReadComplete += bytesRead;
                fileStream.Write(buffer, 0, bytesRead);                    
            }

        }
 }

因为来自相机的流是无穷无尽的,所以请求也是如此。当用户停止请求时,录制也应如此。

上面的设置有效,但存在一些问题。看起来流首先存储在服务器的内存中,并且仅在请求停止后才保存。我认为这会给大型视频带来问题。有没有办法立即保存视频?

此外,似乎存在用户停止请求但服务器继续录制视频的问题。有没有办法确保请求停止?

我知道这个解决方案远非理想。我已经搜索了最高和最低的解决方案,但到目前为止我还没有找到它。我希望我能让它发挥作用。无论如何,Thanx。

1 个答案:

答案 0 :(得分:1)

正在服务器中同步处理请求。这意味着处理请求的Web服务器线程将发出另一个请求来获取视频流(使用webclient),并在读取流时继续运行。即使用户取消请求,Web服务器线程也将继续运行。

我会将录制功能与表示层(网页)分开。我会去Windows服务处理流和网页,以将录制命令发送到Windows服务。您可以使用队列轻松实现网页和Windows服务之间的通信,以存储命令(db表,windows azure队列等)。

Windows服务将循环读取队列(在单独的线程上),并发出处理该流的线程信号,以便它可以停止录制。