C# 海康威视摄像头二次开发入门HCNetSDK 登录、实时预览、云台控制、录像与抓图WinForms 实战想在自己的程序里接入海康摄像头实时画面、控制云台转向、录像、拍照就绕不开海康官方的HCNetSDK。它本质是一套 C/C 编写的非托管 DLLC# 通过 P/InvokeDllImport来调用。本文用一个完整的 WinForms 练习程序带你走完海康摄像头二开的标准流程SDK 初始化 → 设备登录 → 实时预览 → 云台 PTZ 控制 → 录像 → JPEG 抓图每一步都给出代码、关键参数和错误排查。适合第一次接触海康 SDK、有 C# 基础的初学者。一、海康 SDK 二次开发准备1.1 SDK 是什么、从哪获取海康为各类网络摄像机、NVR、球机提供了统一的设备网络 SDKHCNetSDK。我们常用的功能登录、预览、回放、云台、布防、抓图、参数配置都封装在里面。SDK 可以在海康威视开放平台下载注意选择与自己程序匹配的版本本文使用 64 位库。解压后的 SDK 里开发主要用到两部分库文件根目录的 dll如HCNetSDK.dll、HCCore.dll、PlayCtrl.dll播放库、hlog.dll、hpr.dll、MP_Render.dll、SuperRender.dll以及libcrypto/libssl等依赖库HCNetSDKCom 文件夹按功能拆分的组件库如HCPreview.dll预览、HCPlayBack.dll回放、HCAlarm.dll报警布防、HCCoreDevCfg.dll配置等。海康 SDK 还提供了各语言的调用示例其中C# 示例里的CHCNetSDK.cs已经用DllImport把成百上千个函数、结构体、常量全部声明好了。我们直接把这个文件引入工程即可不需要自己从头声明。1.2 工程搭建初学者最容易踩的环境坑新建 WinForms 项目本文为 .NET Framework 4.7.2把官方示例中的CHCNetSDK.cs加入项目平台必须和 DLL 一致64 位 DLL 就把项目目标平台设为x64项目属性 → 生成 → 目标平台否则会报无法加载 DLL把 SDK 的库文件 dll 和整个HCNetSDKCom文件夹拷贝到程序运行目录bin\DebugC# 调用非托管 DLL 的原理是 P/Invoke形如// CHCNetSDK.cs 内部就是这样声明 SDK 函数的DllImport 指定非托管 dll[DllImport(HCNetSDK.dll)]publicstaticexternboolNET_DVR_Init();只要理解CHCNetSDK这个静态类里封装了所有 SDK 函数我们像调用普通 C# 静态方法一样调用它们即可。二、程序界面与运行效果界面分为几个区域左侧一个大的PictureBox用来显示摄像头实时画面登录授权、画面预览按钮云台控制区上、下、左、右方向键一个Auto自动巡航按钮以及一个云台速度下拉框1~7 档Start Record / Stop Record开始/停止录像拍照抓取一张 JPEG。【插图程序运行效果图】三、整体调用流程与两个关键句柄海康 SDK 的调用有严格顺序后面的功能依赖前面拿到的句柄两个必须理解的概念登录句柄m_userId登录成功后返回代表和这台设备建立的会话抓图等设备级操作用它预览句柄m_lRealHandle开始预览后返回代表这一路实时画面云台、录像等针对画面的操作用它。句柄返回-1或 0、false表示失败此时立刻调用NET_DVR_GetLastError()拿错误码排查。窗体中先声明这两个句柄并初始化privateintm_userId-1;// 设备登录句柄publicintm_lRealHandle-1;// 预览播放句柄四、第一步SDK 初始化在窗体加载事件里初始化 SDK并设置连接超时时间privatevoidForm1_Load(objectsender,EventArgse){// 初始化 SDK整个程序只需要调用一次返回 false 表示失败boolinitSuccessCHCNetSDK.NET_DVR_Init();if(!initSuccess){MessageBox.Show($sdk初始化失败错误码:{CHCNetSDK.NET_DVR_GetLastError()});}else{// 设置连接设备的等待时间(毫秒)与重试次数还可按需配置断线重连等CHCNetSDK.NET_DVR_SetConnectTime(2000,1);}}五、第二步设备登录通过 IP、端口海康默认8000、用户名、密码登录设备。登录成功会返回m_userId设备信息含序列号写入NET_DVR_DEVICEINFO_V30结构体privatevoidbutton1_Click(objectsender,EventArgse){// 准备设备信息结构体登录成功后会被填充CHCNetSDK.NET_DVR_DEVICEINFO_V30deviceInfonewCHCNetSDK.NET_DVR_DEVICEINFO_V30();// 登录IP、端口、用户名、密码、设备信息(引用传递)// 返回 -1 失败其它值即用户 ID登录句柄m_userIdCHCNetSDK.NET_DVR_Login_V30(192.168.215.64,8000,admin,你的密码,refdeviceInfo);if(m_userId0){interrCode(int)CHCNetSDK.NET_DVR_GetLastError();MessageBox.Show($相机登录失败,错误码:{errCode});}else{// sSerialNumber 是字节数组转成字符串得到设备序列号MessageBox.Show($相机登录成功,设备序列号: Encoding.ASCII.GetString(deviceInfo.sSerialNumber));}}练习时把 IP、账号、密码直接写在代码里没问题正式项目建议放到配置文件并保证电脑和摄像头在同一网段、能 ping 通。六、第三步实时预览登录成功后填充NET_DVR_PREVIEWINFO结构体指定播放窗口、通道、码流、连接方式然后调用NET_DVR_RealPlay_V40开始预览privatevoidbutton2_Click(objectsender,EventArgse){if(m_userId0){MessageBox.Show(请先登录设备);return;}CHCNetSDK.NET_DVR_PREVIEWINFOpreviewInfonewCHCNetSDK.NET_DVR_PREVIEWINFO();previewInfo.hPlayWndthis.pictureBox1.Handle;// 画面渲染到哪个控件给 PictureBox 的句柄previewInfo.lChannel1;// 通道号网络摄像机默认 1 通道previewInfo.dwStreamType0;// 码流类型0 主码流1 子码流previewInfo.dwLinkMode0;// 连接模式0 TCP1 UDP…// 开始实时预览传入登录句柄、预览参数回调传 null直接渲染到窗口// 返回预览句柄0 表示失败m_lRealHandleCHCNetSDK.NET_DVR_RealPlay_V40(m_userId,refpreviewInfo,null,IntPtr.Zero);if(m_lRealHandle0){interrCode(int)CHCNetSDK.NET_DVR_GetLastError();MessageBox.Show($实时预览失败,错误码:{errCode});}}如果不想让 SDK 直接渲染画面而是想自己拿到每一帧码流例如做转码、AI 分析可以把第三个参数传一个码流回调函数再配合播放库PlayCtrl处理。入门阶段直接给窗口句柄最简单。七、第四步云台 PTZ 控制方向 / 速度 / 自动巡航带云台的球机可以控制镜头转动。这里用的是NET_DVR_PTZControlWithSpeed函数签名为boolNET_DVR_PTZControlWithSpeed(intlRealHandle,uintdwPTZCommand,uintdwStop,uintdwSpeed);dwPTZCommand动作命令上/下/左/右/自动等dwStop0 启动动作1 停止动作dwSpeed速度1~7。关键交互技巧在方向按钮的MouseDown按下事件里启动转动dwStop0MouseUp松开事件里停止dwStop1这样按住就转、松手即停。以向左为例// 按下左开始向左转速度取下拉框选中值privatevoidbutton5_MouseDown(objectsender,MouseEventArgse){CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle,(uint)CHCNetSDK.PAN_LEFT,0,Convert.ToUInt32(comboBoxSpeed.SelectedItem));}// 松开左停止转动dwStop1privatevoidbutton5_MouseUp(objectsender,MouseEventArgse){CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle,CHCNetSDK.PAN_LEFT,1,Convert.ToUInt32(comboBoxSpeed.SelectedItem));}其余三个方向完全一样只是命令常量不同// 向上NET_DVR_PTZControlWithSpeed(m_lRealHandle,(uint)CHCNetSDK.TILT_UP,0,speed);// 向下NET_DVR_PTZControlWithSpeed(m_lRealHandle,(uint)CHCNetSDK.TILT_DOWN,0,speed);// 向右NET_DVR_PTZControlWithSpeed(m_lRealHandle,(uint)CHCNetSDK.PAN_RIGHT,0,speed);// 对应的 MouseUp 把第三个参数改为 1 即可常用 PTZ 命令常量定义在 CHCNetSDK.cs命令常量值含义TILT_UP21向上TILT_DOWN22向下PAN_LEFT23向左PAN_RIGHT24向右PAN_AUTO29水平自动扫描自动巡航用一个按钮在启动/停止之间切换privatevoidbutton5_Click(objectsender,EventArgse){if(btnAuto.TextAuto){// 开启水平自动旋转按钮文字切换为 StopCHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle,CHCNetSDK.PAN_AUTO,0,Convert.ToUInt32(comboBoxSpeed.SelectedItem));btnAuto.TextStop;}else{// 再次点击停止自动旋转CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle,CHCNetSDK.PAN_AUTO,1,Convert.ToUInt32(comboBoxSpeed.SelectedItem));btnAuto.TextAuto;}}注意云台控制必须在预览成功之后需要预览句柄且摄像头本身要支持云台固定枪机调用会报错。八、第五步录像保存实时码流录像用NET_DVR_SaveRealData开始把实时码流写入文件用NET_DVR_StopSaveRealData停止。同样要先开预览privatestringm_recordDirDirectory.GetCurrentDirectory()\\录像文件\\;privatevoidbtnRecord_Click(objectsender,EventArgse){if(m_lRealHandle0){MessageBox.Show(请先开启画面预览);return;}// 目录不存在则自动创建if(!Directory.Exists(m_recordDir))Directory.CreateDirectory(m_recordDir);// 用时间戳生成文件名避免覆盖stringfileNamem_recordDirDateTime.Now.ToString(yyyyMMdd_HHmmss).mp4;// 开始保存实时数据录像boolresultCHCNetSDK.NET_DVR_SaveRealData(m_lRealHandle,fileName);if(!result)MessageBox.Show($开始录像失败错误码{CHCNetSDK.NET_DVR_GetLastError()});elseMessageBox.Show($录像已开始\n保存路径{fileName});}// 停止录像privatevoidStopRecord_Click(objectsender,EventArgse){if(m_lRealHandle0)return;boolresultCHCNetSDK.NET_DVR_StopSaveRealData(m_lRealHandle);if(!result)MessageBox.Show($结束录像失败错误码{CHCNetSDK.NET_DVR_GetLastError()});elseMessageBox.Show(录像已结束文件已保存);}九、第六步JPEG 抓图拍照抓图用NET_DVR_CaptureJPEGPicture它使用登录句柄和通道号并通过NET_DVR_JPEGPARA指定图片质量与分辨率privatestringm_rJPEGDirDirectory.GetCurrentDirectory()\\图片文件\\;privatevoidbtnJPEG_Click(objectsender,EventArgse){if(!Directory.Exists(m_rJPEGDir))Directory.CreateDirectory(m_rJPEGDir);// 用时间戳命名 jpgstringsJpegPicFileNamem_rJPEGDirDateTime.Now.ToString(yyyyMMdd_HHmmss).jpg;intlChannel1;// 通道号CHCNetSDK.NET_DVR_JPEGPARAlpJpegParanewCHCNetSDK.NET_DVR_JPEGPARA();lpJpegPara.wPicQuality0;// 图像质量lpJpegPara.wPicSize0xff;// 抓图分辨率0xff Auto使用当前码流分辨率// JPEG 抓图登录句柄、通道、参数、保存路径返回 false 失败if(!CHCNetSDK.NET_DVR_CaptureJPEGPicture(m_userId,lChannel,reflpJpegPara,sJpegPicFileName)){uinterrCHCNetSDK.NET_DVR_GetLastError();MessageBox.Show(抓图失败, error code err);}else{MessageBox.Show(抓图成功文件已保存sJpegPicFileName);}}运行后即可在程序目录的图片文件文件夹看到拍下的 jpg 照片。抓图还有一种方式是在预览回调里对当前帧抓图NET_DVR_CaptureJPEGPicture_NEW等入门用上面的设备抓图接口即可。十、资源释放与可改进点本程序以练通二开流程为目的功能跑通即可。工程上还可以再完善了解即可窗体关闭时应依次调用NET_DVR_StopRealPlay停止预览、NET_DVR_Logout登出、NET_DVR_Cleanup释放 SDK并可加入断线重连、把账号参数移到配置文件等。这些属于健壮性优化不影响理解核心调用流程。十一、常见错误码与排查任何 SDK 函数失败都先用NET_DVR_GetLastError()取错误码再对照官方《错误码对照表》。初学者高频问题现象 / 错误码可能原因与处理报无法加载 DLL HCNetSDK平台不匹配x86/x64、dll 或 HCNetSDKCom 没拷到运行目录、缺依赖库错误码 7连接失败电脑和摄像头网络不通、IP 不在同一网段、端口不是 8000先 ping 测试错误码 1密码错误用户名/密码错误多次输错设备会临时锁定 IP需等待或重启设备预览黑屏 / 报错没登录成功、通道号不对、hPlayWnd句柄错误、设备不支持该码流云台控制报错没有先预览句柄无效、设备是不带云台的固定枪机录像/抓图找不到文件路径用的是相对当前目录确认程序实际运行目录及文件夹权限排查口诀先通网络ping→ 再对平台和 DLL → 然后看登录是否成功 → 最后看错误码。十二、小结本文用一个 WinForms 练习程序完整走了一遍海康 HCNetSDK 二次开发流程引入官方CHCNetSDK.cs封装把 dll 和HCNetSDKCom放到运行目录、选对 x64 平台NET_DVR_Init初始化、NET_DVR_Login_V30登录拿到m_userIdNET_DVR_RealPlay_V40把画面渲染到 PictureBox拿到m_lRealHandleNET_DVR_PTZControlWithSpeed配合 MouseDown/MouseUp 实现方向控制与速度调节PAN_AUTO实现自动巡航NET_DVR_SaveRealData / StopSaveRealData录像NET_DVR_CaptureJPEGPicture抓 JPEG任何失败都用NET_DVR_GetLastError取错误码定位。掌握这套初始化—登录—预览—业务操作—释放的固定套路后再去做回放、报警布防、参数配置等更高级功能就会轻松很多。建议对照本文代码接一台真实摄像头或用海康模拟器亲手跑一遍。
企业数字化 ERP 产品动态
相关推荐
嵌入式开发四大断裂带:工具链、硬件、协议与量产的隐性知识图谱 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:41:10
网站申请备案避坑指南:选对服务商哪家好? 网站申请备案避坑指南:选对服务商哪家好? 找建站公司最怕什么?不是技术不行,而是被坑高价还办不好备案。很多老板花了几千块做站,结果卡在域名申请备案这一步,要么材料反复驳回,要么被第三方乱收费,最后网站迟迟上不了线。到底域名申请备案哪家好?别… · 2026/9/27 2:41:10
国产2.5G双光口网卡:政企网络链路冗余与国产化落地实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:22:25
Android 12蓝牙框架全解析:从HCI到应用层的分层与排障 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:22:25
海口网络建站模板一文搞懂:避开高价坑的5步实操法 海口网络建站模板一文搞懂:避开高价坑的5步实操法 找海口网络建站模板,最怕啥?不是丑,是被坑。很多老板拿着几万块的预算,被销售忽悠着上了个“高端定制”,结果交出来的东西跟淘宝几十块的模板没两样,改个色还得加钱。这种高价低质的坑,在海口乃至全… · 2026/9/27 3:22:19
DeepSeek崩溃应对全攻略:状态判断、API降级与本地部署兜底方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:22:19
PLECS热仿真核心原理与电-热耦合建模实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:22:19
基于STM32与DDS技术的可调频波形发生器设计与实现 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:22:13
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01