物联网工具——摄像头对接(18)

366 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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);
        }

摄像头预览

  1. 连接摄像头,获取连接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);
            }
        }
  1. 登录
 /// <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);
        }

测试

image.png