我正在做一个网络项目,其中用户必须能够记录视频,使用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);
}
}
}因为来自摄像头的流是无穷无尽的,所以请求也是如此。当用户停止请求时,录制也应该停止。
上面的设置可以正常工作,但也存在一些问题。似乎流首先存储在服务器的内存中,只有在请求停止后才会保存。我认为这会给大视频带来问题。有没有办法立即保存视频?
此外,似乎存在一个问题,即用户停止请求,但服务器继续录制视频。有没有办法确保请求停止?
我知道这个解决方案远非理想。我到处寻找最好的解决方案,但到目前为止还没能找到。我只希望我能把这事办好。不管怎样,谢谢你。
发布于 2012-10-01 21:22:04
该请求正在服务器中同步处理。这意味着处理请求的web服务器线程将发出另一个获取视频流的请求(使用web客户端),并将在读取视频流的同时保持运行。即使用户取消了请求,web服务器线程仍将继续运行。
我会将录制功能与表示层(网页)分开。我会使用Windows服务来处理流,并使用网页来向windows服务发送录制命令。您可以使用一个队列来存储命令(db表、windows azure队列等),从而轻松地实现网页和windows服务之间的通信。
Windows服务将在循环中读取队列(在单独的线程上),并向处理流的线程发出信号,以便它可以停止记录。
https://stackoverflow.com/questions/12672589
复制相似问题