代码之家  ›  专栏  ›  技术社区  ›  Pbirkoff

将无尽的IP摄像机流保存到文件

  •  0
  • Pbirkoff  · 技术社区  · 12 年前

    我正在做一个网络项目,用户必须能够使用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);                    
                }
    
            }
     }
    

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

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

    此外,似乎存在一个问题,即用户停止了请求,但服务器一直在录制视频。有没有办法确保请求停止?

    我知道这个解决方案远非理想。我到处寻找最佳解决方案,但到目前为止还没能找到。我只是希望我能把它发挥作用。无论如何,谢谢。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Tiago    12 年前

    服务器正在同步处理该请求。这意味着处理请求的web服务器线程将发出另一个请求以获取视频流(使用web客户端),并在读取视频流时保持运行。即使用户取消了请求,web服务器线程仍将继续运行。

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

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