0

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.

2
  • I worked for a company that did this. I its all do do with KeyFrames and taking slices of video and storing them into the Db through a recieving server. Then piecing all streams together on the fly through an RTSP Protocol. If you get hat block working you could be onto a real money spinner. Commented Oct 1, 2012 at 11:53
  • It seems like you want to save it to disk, there is a method on FileStream called Flush. This flushes all data which has not been written to disk. I'm a bit unsure how WebStreams handle memory though, can you somehow mark the beginning of the stream as read or delete it? Commented Oct 1, 2012 at 14:00

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

3 Comments

Sounds interesting. Would it be possible to start multiple instances of the service? That way multiple users can record a video at once. Do you have any documentation or links about this topic?
Well, what you'll want to do is create a new thread for each recording session in the Windows Service. You will need to generate recording IDs so that you can correlate recording sessions from the web page. This IDs can be passed to and from the queue. I don't have any documentation. Look at the way Web Roles and Worker Roles work in Windows Azure and how communication is implemented between them. You can use a similar approach using a Windows Service and a Web Page.
Thanx, I'll dive into it! Thanks for your advice!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.