从 Hikvision IP 摄像机抓取帧
Grabbing frames from a Hikvision IP-camera
我在从远程 IP 摄像机抓取帧时遇到问题。
我的雇主希望它在 C# .NET 中完成(Windows),并且如果可能的话使用轻量级解决方案,即不使用任何大型框架。
设备型号是 DS-2CD2632F-I,它目前连接到我的 LAN,并且相机的 Web 界面工作正常。
我已经尝试了几个流行的框架,例如AForge、EmguCV、OzekiSDK 和 Directshow.NET,但其中 none 似乎可以正常工作。
特别是 OzekiSDK(显然是海康威视推荐的?)无法从摄像头获取视频流,即使我只是使用提供的示例项目,它只是显示黑屏并抛出 "Empty camera object" 异常,如果我尝试抓取帧。
相机的 Web 界面工作正常,甚至 VLC 播放器也设法通过 rtsp:// link (rtsp://my_ip:554//Streaming/Channels/1
) 成功播放来自相机的流,无需登录和密码。
我考虑过使用 libvlcnet,但我不确定它是否是一个可行的解决方案。
你有什么建议吗?
好的,所以我想我明白了。我会 post 解决方案在这里,以防将来有人需要它。
我发现,对于这种特殊类型的相机,有一个 url,它只是 returns 来自相机的当前帧作为 JPEG 图片,看起来像这样:
http://IP_ADDRESS:PORT/Streaming/channels/1/picture?snapShotImageType=JPEG
因为我的雇主只需要能够在他想要的时候从相机中抓取一帧并且不需要流式传输视频本身,所以我只是编写了一个应用程序来从中复制这个 JPEG url 通过使用异步 Web 请求:
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
我在从远程 IP 摄像机抓取帧时遇到问题。 我的雇主希望它在 C# .NET 中完成(Windows),并且如果可能的话使用轻量级解决方案,即不使用任何大型框架。
设备型号是 DS-2CD2632F-I,它目前连接到我的 LAN,并且相机的 Web 界面工作正常。
我已经尝试了几个流行的框架,例如AForge、EmguCV、OzekiSDK 和 Directshow.NET,但其中 none 似乎可以正常工作。 特别是 OzekiSDK(显然是海康威视推荐的?)无法从摄像头获取视频流,即使我只是使用提供的示例项目,它只是显示黑屏并抛出 "Empty camera object" 异常,如果我尝试抓取帧。
相机的 Web 界面工作正常,甚至 VLC 播放器也设法通过 rtsp:// link (rtsp://my_ip:554//Streaming/Channels/1
) 成功播放来自相机的流,无需登录和密码。
我考虑过使用 libvlcnet,但我不确定它是否是一个可行的解决方案。
你有什么建议吗?
好的,所以我想我明白了。我会 post 解决方案在这里,以防将来有人需要它。
我发现,对于这种特殊类型的相机,有一个 url,它只是 returns 来自相机的当前帧作为 JPEG 图片,看起来像这样:
http://IP_ADDRESS:PORT/Streaming/channels/1/picture?snapShotImageType=JPEG
因为我的雇主只需要能够在他想要的时候从相机中抓取一帧并且不需要流式传输视频本身,所以我只是编写了一个应用程序来从中复制这个 JPEG url 通过使用异步 Web 请求:
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