当前位置: 首页 > news >正文

最近在折腾海康威视工业相机的二次开发,发现网上针对多相机管理的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.jsqmd.com/news/529031/

相关文章:

  • 如何快速掌握fastMRI:医学影像重建的终极入门指南
  • WuliArt Qwen-Image Turbo全流程解析:从输入Prompt到保存图片,一步步带你操作
  • 嵌入式OLED驱动库:SSD1306/SH1106轻量级显示解决方案
  • 终极指南:如何用XLNet在GLUE基准测试中实现多任务语言理解新高度
  • RN41/RN42蓝牙模块嵌入式控制库详解
  • Win10系统下ANSYS 18.2与Visual Studio 2012及Intel Fortran的协同配置指南
  • TeXMe:让Markdown与LaTeX无缝融合的自渲染解决方案
  • 5步焕新你的旧设备:OpenCore Legacy Patcher全攻略
  • Qwen2-VL-2B-Instruct数据库课程设计:构建多模态内容管理平台
  • 乐山美食推荐:五代传承的非遗老汤,藏在苏稽老宅里的跷脚牛肉 - 新闻快传
  • 如何用Path of Building轻松构建你的流放之路角色:从零到精通的完整指南
  • 3步搞定网页视频:猫抓工具的媒体资源高效获取方案
  • TensorFlow多类支持向量机终极指南:一对多策略实现详解
  • 明晚开播|PostgreSQL 18.3 x IvorySQL 5.3:开启 AI 数据库新纪元
  • Symfony Translation缓存性能终极比较:Redis vs Memcached vs APCu
  • 如何用Python实现多平台媒体内容自动化采集:从技术原理到实战应用
  • PDF补丁丁完整指南:掌握全能PDF编辑工具的终极教程
  • WhateverGreen性能优化终极指南:让你的显卡在macOS上发挥最大潜力
  • Neorg 完整指南:如何在 Neovim 中实现高效笔记管理和任务组织
  • 如何高效配置OCR引擎:解决Umi-OCR HTTP服务响应问题的完整指南
  • Symfony Translation终极性能优化指南:从数据到实践
  • 终极指南:7款Unity建模工具深度评测,从SabreCSG到专业插件
  • VLC播放器美化终极指南:5分钟打造专属影院级播放体验!
  • 2026年白炭黑生产厂家推荐:潍坊三佳化工有限公司,超细/工业级/食品级白炭黑全系供应 - 品牌推荐官
  • 从GlobeLand30数据到业务报表:QGIS栅格分类统计的完整工作流与常见误区盘点
  • ChatGPT 图灵测试实战:构建自动化评估系统与避坑指南
  • 2026基层医疗新范式:乐普云智如何重塑居家随诊生态? - 品牌2026
  • 高效响应,精准传达:观今动漫科普动画制作服务,让知识传播更简单 - 深度智识库
  • 终极指南:如何为 instant.page 项目贡献代码与测试
  • Qiskit 量子门超详细解析(从入门到精通)