Search code examples
c#video-capture

Save endless IP Camera stream to file


I'm working on a web-project, where users must be able to record a video, using an IP-camera (Mobotix camera). I've came up with several ideas, but none of them really worked. Because I cannot install any software on the Client PC's, I came up with the idea to save the recording on the server. So the users opens a page in his browsers, and in the request, the server opens a request to the camera (using a build-in stream provided by the camera through HTTP: http:///cgi-bin/faststream.jpg?stream=full&fps=1.0 ), and save the stream to the server with this code:

   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);                    
            }

        }
 }

Because the stream from the camera is endless, so is the request. When the user stops the request, so should the recording.

The setup above works, although there are some problems. It seems like the stream is first stored in the memory of the server and is saved only after the request has stopped. I think this will create problems for large videos. Is there a way to immediately save the video?

Also, there seems to be a problem where the user stops the request, but the server keeps recording the video. Is there a way to make sure the request stops?

I know this solution is far from ideal. I've searched high and low for the best solution, but I haven't been able to find it so far. I just hope I can get this to work. Thanx anyway.


Solution

  • The request is being processed synchronously in the server. This means that the web server thread processing the request, will make another request to get the video stream (using the webclient) and will keep running while the stream is being read. Even though the user cancels the request, the web server thread will keep running.

    I would separate the recording functionality from the presentation layer (web page). I would go for a Windows Service to process the stream and the web page to send recording commands to the windows service. You can easily implement the communication between the web page and the windows service using a queue to store the commands (db table, windows azure queues, etc).

    The Windows Service would read the queue in a loop (on a separate thread) and signal the thread processing the stream so that it could stop recording.