携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
海康sdk下载
登录海康管网,在开发者下载位置,下载C#开发包
目前我下载的64位C#开发sdk
CH-HCNetSDKV6.1.9.4_build20220412_win64_20220419185136
下载地址:
open.hikvision.com/download/5c…
sdk集成
请将下载后sdk,解压,在库文件 的文件里的HCNetSDK.dll、HCCore.dll、HCNetSDKCom文件夹、libssl-1_1-x64.dll、libcrypto-1_1-x64.dll、hlog.dll、hpr.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、MP_Render.dll、YUVProcess.dll等文件均拷贝到bin文件夹下。HCNetSDKCom文件夹(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改。
修改页面
增加摄像头类
- form目录下创建hivision目录
- 创建camera.cs界面
- 页面中放置一个picturebox,dock:fill
将sdk中的chanconfig.cs & chcnetsdk.cs两个文件cp到该目录下
代码实现
数据库新增摄像头配置
"ip": "192.168.1.164",
"port": "8000",
"user": "admin",
"pass": "123456",
"char1": "1",
"char2": "0",
"char3": "n",
"char4": "c"
}
格式如上,type是camconf
- ip是摄像头的ip地址
- user摄像头登录ip
- pass 摄像头密码
- port 默认8000通讯端口,不需要修改
- char1,char2,char3,char4是叠加的字符,后续用
/// <summary>
/// 获取摄像头配置
/// </summary>
/// <returns></returns>
public static DataTable GetCameraConfFromDB()
{
string sqlcmd = $"select * from sysconf where type='camconf'";
return MySqliteAPI.GetDataFromDB(sqlcmd);
}
/// <summary>
/// 设置摄像头配置
/// </summary>
/// <returns></returns>
public static int SetCameraConfToDB(JObject confdata)
{
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
string sqlcmd = $"update sysconf set data='{confdata}',intime='{time}' where type='camconf'";
return MySqliteAPI.UPdateDataToDB(sqlcmd);
}
摄像头预览
- 连接摄像头,获取连接id
/// <summary>
/// 摄像头初始化
/// </summary>
private void CamInit()
{
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
MessageBox.Show("HK 初始化失败");
return;
}
else
{
//保存SDK日志 To save the SDK log
CHCNetSDK.NET_DVR_SetLogToFile(3, LogName, true);
}
}
- 登录
/// <summary>
/// 登录设备
/// </summary>
private void LoginFunction()
{
string textBoxIP = camconf["ip"].ToString();
string textBoxPort = camconf["port"].ToString();
string textBoxUserName = camconf["user"].ToString();
string textBoxPassword = camconf["pass"].ToString();
try
{
struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();
//设备IP地址或者域名
byte[] byIP = Encoding.Default.GetBytes(textBoxIP);
struLogInfo.sDeviceAddress = new byte[129];
byIP.CopyTo(struLogInfo.sDeviceAddress, 0);
//设备用户名
byte[] byUserName = Encoding.Default.GetBytes(textBoxUserName);
struLogInfo.sUserName = new byte[64];
byUserName.CopyTo(struLogInfo.sUserName, 0);
//设备密码
byte[] byPassword = Encoding.Default.GetBytes(textBoxPassword);
struLogInfo.sPassword = new byte[64];
byPassword.CopyTo(struLogInfo.sPassword, 0);
//设备服务端口号
struLogInfo.wPort = ushort.Parse(textBoxPort);
struLogInfo.cbLoginResult = LoginCallBack;
//是否异步登录:0- 否,1- 是
struLogInfo.bUseAsynLogin = false;
DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();
//登录设备 Login the device
m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);
if (m_lUserID < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
//登录失败,输出错误号
msgstr = "NET_DVR_Login_V40 failed, error code= " + iLastErr;
MessageBox.Show(msgstr);
return;
}
else
{
//日志
MyLogger._.Info("登录成功");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
}
}
3.预览
/// <summary>
/// 查看实时画面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PreviewFunc()
{
if (m_lUserID < 0)
{
MessageBox.Show("请先登录设备");
return;
}
if (m_lRealHandle < 0)
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
//预览窗口
lpPreviewInfo.hPlayWnd = RealPlayWnd.Handle;
//预te览的设备通道
lpPreviewInfo.lChannel = Int16.Parse("1");
//码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
lpPreviewInfo.dwStreamType = 0;
//连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
lpPreviewInfo.dwLinkMode = 0;
//0- 非阻塞取流,1- 阻塞取流
lpPreviewInfo.bBlocked = true;
//播放库播放缓冲区最大缓冲帧数
lpPreviewInfo.dwDisplayBufNum = 1;
lpPreviewInfo.byProtoType = 0;
lpPreviewInfo.byPreviewMode = 0;
if (RealData == null)
{
//预览实时流回调函数
RealData = new CHCNetSDK.REALDATACALLBACK(RealDataCallBack);
}
//用户数据
IntPtr pUser = new IntPtr();
//打开预览 Start live view
m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser);
if (m_lRealHandle < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
//预览失败,输出错误号
msgstr = "NET_DVR_RealPlay_V40 failed, error code= " + iLastErr;
MessageBox.Show(msgstr);
return;
}
else
{
//MessageBox.Show("预览成功");
MyLogger._.Info("预览成功");
}
}
return;
}
主要函数为以上函数,具体实现查看gitee仓库项目。
修改dashboard
在界面加载完毕后,加载摄像头,这样可以避免页面加载时间过长的问题
增加shown函数回调,具体实现如下:
/// <summary>
/// 初始化摄像头
/// </summary>
private void InitCam()
{
camera realpic = new camera();
//取消非顶级窗体
realpic.TopLevel = false;
realpic.Width = this.panelcam.Width;
realpic.Height = this.panelcam.Height;
realpic.Dock = DockStyle.Fill;
realpic.Location = new Point(0, 0);
//展示窗体
realpic.Show();
this.panelcam.Controls.Add(realpic);
}