一、项目整体概述1.1 项目功能基于海康官方SDKCHCNetSDK实现Windows窗体摄像头基础操作全套功能包含SDK初始化、设备登录/退出、实时视频预览/停止预览、云台PTZ上下左右控制、JPG/BMP截图、实时MP4录像/停止录像、程序退出资源释放。1.2 核心开发前提导入海康SDK动态库、引用CHCNetSDK命名空间提前创建程序根目录下image、video文件夹用于存储截图和录像文件摄像头设备与电脑处于同一局域网网络互通二、全局变量定义及作用所有全局状态变量用于管控SDK状态、登录状态、预览状态、错误信息namespace 海康摄像头 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // SDK初始化状态true初始化成功false失败 public bool intSDK; // 存储SDK所有操作的错误码 public uint lastError; // 设备登录ID唯一标识后续所有操作依赖该ID private int userID -1; // 摄像头预览句柄标识预览状态-1未预览 public int irealHanlde -1; // 录像启停状态位 bool isOpen false; // 登录信息结构体 CHCNetSDK.NET_DVR_USER_LOGIN_INFO ploginInfo; // 设备详细信息结构体 CHCNetSDK.NET_DVR_DEVICEINFO_V40 pDeviceInfo;变量考点说明userID设备登录成功后返回的唯一ID预览、截图、录像、云台控制全部依赖该ID核心参数irealHanlde预览句柄区分当前是否正在预览防止重复开启预览lastError接收SDK接口错误码用于排查设备通信异常三、功能模块1SDK初始化3.1 功能逻辑程序加载时自动初始化海康SDK必须先初始化SDK才能执行后续所有设备操作初始化失败直接提示错误码。3.2 分段代码注释private void Form1_Load(object sender, EventArgs e) { // 初始化海康全局SDK环境 intSDK CHCNetSDK.NET_DVR_Init(); // SDK初始化失败处理 if (!intSDK) { // 获取最新错误码 lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(初始化失败错误码 lastError); return; } }3.3 核心考点NET_DVR_Init()SDK初始化入口方法整个程序只执行一次NET_DVR_GetLastError()获取SDK操作错误码所有接口报错均可通过该方法排查四、功能模块2设备登录/退出登录4.1 功能逻辑校验IP、端口、账号、密码非空封装登录结构体信息调用SDK登录接口获取唯一userID支持一键退出登录退出前自动关闭预览。4.2 分段代码注释private void button1_Click(object sender, EventArgs e) { // 非空校验IP、端口、账号、密码不能为空 if (textBox1.Text || textBox2.Text || textBox3.Text||textBox4.Text) { MessageBox.Show(参数不能为空); return; } // 未登录状态执行登录 if (userID0) { // 1.封装设备IP字节数组 byte[] ipbs Encoding.Default.GetBytes(textBox1.Text); ploginInfo new CHCNetSDK.NET_DVR_USER_LOGIN_INFO(); ploginInfo.sDeviceAddress new byte[129]; ipbs.CopyTo(ploginInfo.sDeviceAddress, 0); // 2.封装登录用户名 byte[] namebs Encoding.Default.GetBytes(textBox3.Text); ploginInfo.sUserName new byte[64]; namebs.CopyTo(ploginInfo.sUserName, 0); // 3.封装设备端口号 ploginInfo.wPort ushort.Parse(textBox2.Text); // 4.封装登录密码 byte[] psbs Encoding.Default.GetBytes(textBox4.Text); ploginInfo.sPassword new byte[64]; psbs.CopyTo(ploginInfo.sPassword, 0); // 实例化设备信息结构体 pDeviceInfo new CHCNetSDK.NET_DVR_DEVICEINFO_V40(); // 调用登录接口返回userID userID CHCNetSDK.NET_DVR_Login_V40( ref ploginInfo,ref pDeviceInfo); // 登录失败 if (userID0) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(登录错误错误码 lastError); return; } // 登录成功 else { MessageBox.Show(登录成功); label5.Text 登录的UserID userID; button1.Text 退出; return; } } // 已登录状态执行退出登录 else { // 1.退出设备登录 if (!CHCNetSDK.NET_DVR_Logout(userID)) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(退出失败错误错误码 lastError); return; } userID -1; // 2.强制停止预览释放预览句柄 if (!CHCNetSDK.NET_DVR_StopRealPlay(irealHanlde)) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(退出预览失败错误错误码 lastError); return; } irealHanlde -1; // 清空画面、还原按钮文本 pictureBox1.Image null; button2.Text 开始预览; button1.Text 登录; } }4.3 核心考点NET_DVR_Login_V40新版登录接口传入登录信息、设备信息结构体返回唯一用户IDNET_DVR_Logout退出登录接口必须主动调用否则设备在线状态残留字符串转字节数组拷贝赋值海康SDK结构体参数均为固定长度字节数组必须手动拷贝赋值五、功能模块3实时视频预览/停止预览5.1 功能逻辑必须登录成功后才能预览配置预览通道、码流类型、传输协议、窗口句柄开启实时预览支持一键停止预览。5.2 分段代码注释private void button2_Click(object sender, EventArgs e) { // 未登录禁止预览 if (userID 0) { MessageBox.Show(请先登录再去预览); return; } // 未预览开启预览 if (irealHanlde 0) { // 初始化预览参数结构体 CHCNetSDK.NET_DVR_PREVIEWINFO info new CHCNetSDK.NET_DVR_PREVIEWINFO(); info.lChannel 1; // 预览通道号默认1通道 info.dwStreamType 0; // 0-主码流高清1-子码流 info.dwLinkMode 0; // 0-TCP传输1-UDP2-多播 info.hPlayWnd pictureBox1.Handle;// 绑定预览窗口句柄 info.bBlocked true; // 阻塞模式播放完成才返回结果 info.dwDisplayBufNum 1; // 播放缓存帧数 // 开启实时预览返回预览句柄 irealHanlde CHCNetSDK.NET_DVR_RealPlay_V40(userID, ref info, null, IntPtr.Zero); if (irealHanlde0) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(打开预览失败错误错误码 lastError); return; } else { button2.Text 停止预览; } } // 正在预览停止预览 else { if (! CHCNetSDK.NET_DVR_StopRealPlay(irealHanlde)) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(退出预览失败错误错误码 lastError); return; } irealHanlde -1; button2.Text 开始预览; } }5.3 核心考点NET_DVR_RealPlay_V40开启实时预览核心接口返回预览句柄NET_DVR_StopRealPlay停止预览必须释放句柄防止内存泄漏预览窗口通过句柄(Handle)绑定不直接绑定控件主码流/子码流区分主码流高清占带宽子码流低清适合预览六、功能模块4云台PTZ控制上下左右6.1 功能逻辑基于鼠标按下/松开事件控制摄像头云台转动按下持续转动松开停止转动必须开启预览后才可控制。6.2 分段代码注释// 左键按下向左转动 private void button3_MouseDown(object sender, MouseEventArgs e) { if (irealHanlde0) { MessageBox.Show(请先预览再移动摄像头); return; } // 参数预览句柄、转动方向、0开始转动、速度 CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.PAN_LEFT, 0, 2); } // 左键松开停止转动 private void button3_MouseUp(object sender, MouseEventArgs e) { CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.PAN_LEFT, 1, 2); } // 右键 private void button4_MouseDown(object sender, MouseEventArgs e) { CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.PAN_RIGHT, 0, 2); } private void button4_MouseUp(object sender, MouseEventArgs e) { CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.PAN_RIGHT, 1, 2); } // 上键 private void button5_MouseDown(object sender, MouseEventArgs e) { CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.TILT_UP, 0, 2); } private void button5_MouseUp(object sender, MouseEventArgs e) { CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.TILT_UP, 1, 2); } // 下键 private void button6_MouseDown(object sender, MouseEventArgs e) { CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.TILT_DOWN, 0, 2); } private void button6_MouseUp(object sender, MouseEventArgs e) { CHCNetSDK.NET_DVR_PTZControlWithSpeed(irealHanlde, CHCNetSDK.TILT_DOWN, 1, 2); }6.3 核心考点NET_DVR_PTZControlWithSpeed带速度的云台控制接口参数含义0开始动作1停止动作必须在预览状态下控制云台无预览句柄无法操作七、功能模块5视频截图JPG/BMP双格式7.1 功能逻辑支持单选JPEG、BMP两种截图格式以时间戳命名保存到本地image文件夹防止文件名重复。7.2 分段代码注释private void button7_Click(object sender, EventArgs e) { if (irealHanlde 0) { MessageBox.Show(请先预览再去抓图); return; } // JPG截图 if (radioButton1.Checked) { string imagePath Directory.GetCurrentDirectory() /image/ ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds().jpeg; CHCNetSDK.NET_DVR_JPEGPARA jpeg new CHCNetSDK.NET_DVR_JPEGPARA(); jpeg.wPicSize 0xff; jpeg.wPicQuality 0;//最高画质 int channel 1; if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(userID, channel, ref jpeg, imagePath)) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(抓图jpg失败 错误码 lastError); return; } else { MessageBox.Show(存储成功); } } // BMP截图 else { string imagePath Directory.GetCurrentDirectory() /image/ ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds() .bmp; if (!CHCNetSDK.NET_DVR_CapturePicture(irealHanlde, imagePath)) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(抓图bmp失败 错误码 lastError); return; } else { MessageBox.Show(存储bmp成功); } } }7.3 核心考点NET_DVR_CaptureJPEGPictureJPG高清截图可配置画质、尺寸NET_DVR_CapturePictureBMP无损截图使用时间戳命名文件解决重复覆盖问题八、功能模块6实时MP4录像/停止录像8.1 功能逻辑一键启停录像视频保存至video文件夹通过布尔位记录录像状态防止重复开启录像。8.2 分段代码注释private void button8_Click(object sender, EventArgs e) { string MP4Path Directory.GetCurrentDirectory() /video/ ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds() .mp4; if (irealHanlde0) { MessageBox.Show(请先预览再进行录像); return; } // 开始录像 if (!isOpen) { if (!CHCNetSDK.NET_DVR_SaveRealData(irealHanlde, MP4Path)) { lastError CHCNetSDK.NET_DVR_GetLastError(); MessageBox.Show(录像失败 lastError); return; } else { MessageBox.Show(录像成功); isOpen !isOpen; button8.Text 停止录像; } } // 停止录像 else { if (!CHCNetSDK.NET_DVR_StopSaveRealData(irealHanlde)) { MessageBox.Show(停止录像失败); return ; } else { isOpen !isOpen; button8.Text 开始录像; } } }8.3 核心考点NET_DVR_SaveRealData开启实时录像指定保存路径NET_DVR_StopSaveRealData停止录像必须主动调用保存完整视频九、功能模块7程序退出资源释放9.1 功能逻辑窗体关闭时清理SDK全局资源避免端口占用、内存泄漏。9.2 分段代码注释private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // 全局SDK资源销毁 CHCNetSDK.NET_DVR_Cleanup(); } } }9.3 核心考点NET_DVR_Cleanup()对应初始化方法程序退出必须销毁SDK资源不调用该方法会导致SDK残留下次启动程序报错十、整体流程总结简答题满分模板本项目基于海康CHCNetSDK实现摄像头设备通信程序启动首先初始化SDK环境初始化成功后输入设备IP、端口、账号密码完成设备登录获取唯一用户ID。基于用户ID开启视频实时预览通过云台控制接口实现摄像头上下左右转动支持JPG、BMP两种格式实时截图同时实现MP4视频实时录像与停止录像功能。程序退出时主动清理SDK资源整套流程实现了摄像头设备的基础预览、控制、抓拍、录像功能。十一、易错点总结所有设备操作必须先登录、先预览否则功能报错SDK结构体参数为固定字节数组必须手动拷贝字符串数据预览、录像、云台操作全部依赖对应句柄/用户ID参数不能混淆程序退出必须Cleanup停止预览、退出登录必须主动调用接口截图录像文件夹需提前创建否则保存失败
企业数字化 ERP 产品动态
相关推荐
2026年闺蜜机差异化选购理由,帮你轻松做决策 作为百度旗下深耕智慧家庭的AI硬件品牌,小度为用户提供覆盖全场景需求的AI智能闺蜜机产品,让一台大屏满足全家多元生活需求。 上海小度技术有限公司依托百度二十余年人工智能领域积累,以AI为核心、硬件为载体、场景为落地,聚焦家庭… · 2026/9/25 14:59:33
DeepSeek Harness升级插件不兼容?从API变更到多智能体编排的完整修复指南 1. 升级背景:0.1.5-rc 到底动了什么,会让旧插件集体罢工先说这次升级的起因。我本地一直跑的是 DeepSeek Harness 的 v0.1.5-rc.2,原本用得挺稳,几个第三方插件、两套 Skill、一组多智能体编排任务都工作正常。看到 0.1.5-rc 正式… · 2026/9/25 14:59:27
Atlas 300V 24G 不是显卡,是NPU推理加速卡!YOLO部署与调优全攻略 最近好几个朋友私信问我同一个问题:atlas 300v 24g 是运算加速卡吗?另一边,工作群里又有人折腾 atlas部署yolo,各种报错、性能调优、模型转换的问题聊得不可开交。聊得多了,我发现不少人一开始都把这东西当“华为出的显… · 2026/9/25 14:59:27
1000条数据蒸馏出领域专家模型:大模型蒸馏实战全指南 当初在团队里提出“1000条数据蒸馏领域模型”这个想法时,被质疑得挺狠的。大家都觉得大模型蒸馏怎么也得几万条高质量数据起步,1000条听着就像开玩笑。但结果还真跑通了——垂直领域的分类和抽取任务,用1000条经过精心构建的数据蒸馏出来的7B… · 2026/9/25 15:28:02
Halcon二维码识别实战:从预处理到解码的工业级调优指南 二维码识别这件事,在机器视觉项目里属于那种"看起来简单、做起来坑不少"的典型任务。我做过不少产线上的读码项目,从食品包装袋上的小码到汽车零部件上的激光雕刻码,Halcon 这套工具用下来最大的感受就是:算子给你了&am… · 2026/9/25 15:28:02
Navicat for MySQL 使用指南:从安装连接到避坑排错的完整手册 简介:Navicat for MySQL 是一款专为 MySQL 与 MariaDB 设计的图形化数据库管理工具,适合需要频繁建库、编写 SQL、做备份同步的开发者和运维人员。这份资源提供 Windows 下可直接运行的程序主体,包含 17 个 dll 运行库、3 个 exe 可执行文件、… · 2026/9/25 15:27:49
把资深 BA 装进团队:BA Master 工程化实战手册(TaoToken 配置篇) /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 15:27:43
AutoCAD拖拽打开DWG失效?UAC权限隔离与修复方案详解 把DWG文件直接从资源管理器拽进AutoCAD窗口,这动作不少老用户用了十年以上,几乎成了肌肉记忆。可从Windows 8那代系统开始,这个操作就时不时闹脾气:鼠标拖到命令行或绘图区,指针变成带斜线的圆圈,一松手&am… · 2026/9/25 15:27:43
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37