我在从远程IP摄像头抓取图像时遇到了问题。我的雇主希望它在C# .NET (用于Windows)中完成,如果可能的话,使用轻量级的解决方案,即不使用任何大型框架。
设备型号是DS-2CD2632F-I,它当前连接到我的局域网,摄像头的网络接口工作得很好。
我已经尝试了几个流行的框架,例如AForge,EmguCV,OzekiSDK和Directshow.NET,但它们似乎都不起作用。尤其是OzekiSDK (显然是Hikvision推荐的?)无法从摄像头获取视频流,即使我只是使用提供的示例项目,它只是显示一个黑屏,并在我尝试抓取帧时抛出一个“空摄像头对象”异常。
摄像机的网络接口工作正常,甚至VLC播放器也可以通过rtsp://链接(rtsp://my_ip:554//Streaming/Channels/1)成功地播放摄像机的流,而不需要登录和密码。
我考虑过使用libvlcnet,但我不确定这是一个可行的解决方案。
你有什么建议吗?
发布于 2015-07-15 02:57:13
好了,我想我已经弄明白了。我会在这里发布解决方案,以防将来有人需要它。我发现,对于这种特殊类型的相机,有一个url,它只是将相机中的当前帧作为JPEG图片返回,如下所示:http://IP_ADDRESS:PORT/Streaming/channels/1/picture?snapShotImageType=JPEG
因为我的雇主只需要在他想要的时候从摄像机中抓取一帧,而不需要流传输视频本身,所以我刚刚编写了一个应用程序,通过使用异步Web请求从该url复制此JPEG:
private Bitmap loadedBitmap;
...
private void requestFrame()
{
string cameraUrl = @"http://192.168.0.1XX:80/Streaming/channels/1/picture?snapShotImageType=JPEG";
var request = System.Net.HttpWebRequest.Create(cameraUrl);
request.Credentials = new NetworkCredential(cameraLogin, cameraPassword);
request.Proxy = null;
request.BeginGetResponse(new AsyncCallback(finishRequestFrame), request);
}
void finishRequestFrame(IAsyncResult result)
{
HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
using (Bitmap frame = new Bitmap(responseStream)) {
if (frame != null) {
loadedBitmap = (Bitmap) frame.Clone();
}
}
}
...
requestFrame(); // call the functionhttps://stackoverflow.com/questions/31398958
复制相似问题