0

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

        }
 }

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

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

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

我知道这个解决方案远非理想。我一直在寻找最好的解决方案,但到目前为止我还没有找到它。我只是希望我能让这个工作。无论如何谢谢。

4

1 回答 1

1

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

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

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

于 2012-10-01T13:22:03.740 回答