我在从远程IP摄像机抓取帧时遇到问题.我的雇主希望它在C#.NET(用于Windows)中完成,并且如果可能的话,使用轻量级解决方案,即不使用任何巨大的框架.
设备型号为DS-2CD2632F-I,我们目前连接到我的局域网,相机的网络界面工作得很好.
我已经尝试了几个流行的框架,例如AForge,EmguCV,OzekiSDK和Directshow.NET,但它们似乎都没有工作.特别是OzekiSDK(显然是由海康威视推荐的?)无法从相机中获取视频流,即使我只是使用提供的示例项目,它只是显示黑屏并抛出"空相机对象"异常如果我试图抓住一个框架.
摄像机的Web界面正常工作,甚至VLC播放器也能通过rtsp:// link(rtsp://my_ip:554//Streaming/Channels/1)成功地从摄像机播放流,而无需登录和密码.
我想过使用libvlcnet,但我不确定它是否可行.
你有什么建议?
好的,所以我想我明白了.我会在这里发布解决方案,以防将来有人需要它.我发现,对于这种特殊类型的相机,有一个网址,只是将当前帧从相机返回为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 function
Run Code Online (Sandbox Code Playgroud)