最近在折腾海康威视工业相机的二次开发,发现网上针对多相机管理的C#案例确实不多。直接上干货,分享几个关键点和踩过的坑
海康威视相机二次开发SDK开发多个相机用C#语言写的,提供源码先上段初始化SDK的基础代码// 引用海康SDK的DLL [DllImport(HCNetSDK.dll)] public static extern bool NET_DVR_Init(); public bool InitSDK() { if (!NET_DVR_Init()) { Console.WriteLine(SDK初始化失败错误码 CHCNetSDK.NET_DVR_GetLastError()); return false; } // 设置超时时间 CHCNetSDK.NET_DVR_SetConnectTime(2000, 3); return true; }这里有个反直觉的地方——NETDVRInit()必须最先调用且全局只需执行一次。之前在多相机项目中重复初始化直接导致内存泄漏设备列表都读不全。多相机开发的核心在于设备句柄管理。看这段设备登录逻辑public int LoginDevice(string ip, int port, string user, string pwd) { CHCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo new CHCNetSDK.NET_DVR_DEVICEINFO_V30(); int userId CHCNetSDK.NET_DVR_Login_V30(ip, port, user, pwd, ref deviceInfo); if (userId 0) { uint errCode CHCNetSDK.NET_DVR_GetLastError(); throw new Exception($登录失败:{errCode} 检查IP:{ip}是否在线); } Console.WriteLine($设备{ip}登录成功通道数:{deviceInfo.byChanNum}); return userId; }重点注意userId这个返回值每个相机实例必须单独保存。之前用字典存 的映射比数组管理方便得多。当需要同时操作8个相机时用Parallel.ForEach跑登录流程记得加互斥锁海康SDK内部某些方法不是线程安全的。海康威视相机二次开发SDK开发多个相机用C#语言写的,提供源码抓图功能最常被问到来个异步抓流示例public void StartCapture(int userId, int channel) { CHCNetSDK.REALDATACALLBACK realDataCallback new CHCNetSDK.REALDATACALLBACK(RealDataCallBack); IntPtr handle CHCNetSDK.NET_DVR_RealPlay_V30(userId, channel, realDataCallback, IntPtr.Zero); if (handle IntPtr.Zero) { uint errCode CHCNetSDK.NET_DVR_GetLastError(); CHCNetSDK.NET_DVR_Logout(userId); throw new Exception($开启预览失败:{errCode}); } } private void RealDataCallBack(int lRealHandle, uint dwDataType, IntPtr pBuffer, uint dwBufSize, IntPtr pUser) { // 这里处理视频流数据注意线程切换 if (dwDataType CHCNetSDK.NET_DVR_STREAMDATA) { byte[] data new byte[dwBufSize]; Marshal.Copy(pBuffer, data, 0, (int)dwBufSize); // 推入队列或保存文件... } }回调函数里千万别直接操作UI控件用Invoke或者Channel写入内存队列。实测16路1080P视频流同时处理时不加缓冲队列直接崩给你看。最后提醒资源释放顺序public void CleanUp() { foreach(var handle in cameraHandles.Values) { CHCNetSDK.NET_DVR_StopRealPlay(handle); CHCNetSDK.NET_DVR_Logout(handle); } CHCNetSDK.NET_DVR_Cleanup(); }先停流再登出最后清理SDK反过来会导致内存报错。项目源码已打包包含相机分组管理、异常重连机制需要的自取github.com/xxx/hikvision-multi-cam实际开发中最麻烦的是SDK版本匹配一定确认DLL版本与相机固件兼容。遇到过v5.4的SDK连接新版相机死活报错升级到v6.1瞬间治愈的情况。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2444654.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!