ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C# 海康摄像头SDK开发完整笔记(初始化/登录/预览/云台控制/截图/录像)

C# 海康摄像头SDK开发完整笔记(初始化/登录/预览/云台控制/截图/录像) 一、项目整体概述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停止预览、退出登录必须主动调用接口截图录像文件夹需提前创建否则保存失败
返回列表