养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

海康SDK编程指南

时间:2024-11-02 22:34:14

目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息。本文仅对视频监控常用功能的使用进行说明,其它未实现功能请参看设备网络SDK使用手册和播放库编程指南V7.2。

方法/步骤

1、IPC_SDK编程指南3)获取配置信息Hik饱终柯肢.NET_DVR_FOCUSMODE_CFGfocusModeCfg=newHik.NET_DVR_FOCUSMODE_CFG()稆糨孝汶;//实例化聚焦模式结构体Int32size=Marshal.SizeOf(focusModeCfg);//获取结构体大小IntPtrptrCfg=Marshal.AllocHGlobal(size);//设置指针空间大小Hik.NET_DVR_GetDVRConfig(_userId,3305,_channelId,ptrCfg,(UInt32)size,refdwReturn);//获取聚焦模式信息的指针focusModeCfg=(Hik.NET_DVR_FOCUSMODE_CFG)Marshal.PtrToStructure(ptrCfg,typeof(Hik.NET_DVR_FOCUSMODE_CFG));//指针转换为聚焦模式结构体Marshal.FreeHGlobal(ptrCfg);//释放指针4)聚焦模式切换命令0自动1手动2半自动5)聚焦模式切换结构体NET_DVR_FOCUSMODE_CFG6)设置配置信息Hik.NET_DVR_FOCUSMODE_CFGfocusModeCfg=获取配置信息();Int32size=Marshal.SizeOf(focusModeCfg);//获取结构体大小IntPtrptrCfg=Marshal.AllocHGlobal(size);//设置指针空间大小focusModeCfg.byFocusMode=(byte)聚焦模式命令;Marshal.StructureToPtr(focusModeCfg,ptrCfg,false);//结构体转换为指针Hik.NET_DVR_SetDVRConfig(_userId,Hik.NET_DVR_SET_FOCUSMODECFG,_channelId,ptrCfg,(uint)size);//设置聚焦模式Marshal.FreeHGlobal(ptrCfg);//释放指针12.OSD字符设置1)设备配置命令1030;//获取叠加字符操作命令1031;//设置叠加字符操作命令2)通道号或者组号ChannelId//登录IPC设备时获取的通道号3)获取配置信息Hik.NET_DVR_SHOWSTRING_V30struShowStrCfg=newHik.NET_DVR_SHOWSTRING_V30();//初始化叠加字符结构体Int32size=Marshal.SizeOf(struShowStrCfg);//获取结构体空间大小IntPtrptr=Marshal.AllocHGlobal(size);//设置指针大小Hik.NET_DVR_GetDVRConfig(_userId,1030,_channelId,ptr,(UInt32)size,refdwReturn);//获取配置信息struShowStrCfg=(Hik.NET_DVR_SHOWSTRING_V30)Marshal.PtrToStructure(ptr,typeof(Hik.NET_DVR_SHOWSTRING_V30));//指针转换为结构体Marshal.FreeHGlobal(ptr);//释放指针4)叠加字符结构体NET_DVR_SHOWSTRINGINFOstruStringInfo;/*要显示的字符内容*/说明:设置叠加字符需要为其属性赋值。5)设置配置信息Hik.NET_DVR_SHOWSTRING_V30struShowStrCfg=获取叠加字符配置信息();Int32size=Marshal.SizeOf(struShowStrCfg);//获取结构体空间大小IntPtrptr=Marshal.AllocHGlobal(size);//设置指针空间大小Stringosd="海康智能监控视频一";struShowStrCfg.struStringInfo[0].wShowString=1;//1为显示,0为不显示struShowStrCfg.struStringInfo[0].sString=osd;//叠加的字符串struShowStrCfg.struStringInfo[0].wStringSize=(ushort)(osd.Length*2);//字符串大小struShowStrCfg.struStringInfo[0].wShowStringTopLeftX=0;//坐标struShowStrCfg.struStringInfo[0].wShowStringTopLeftY=0;//坐标Marshal.StructureToPtr(struShowStrCfg,ptr,false);//街头体转换为指针Hik.NET_DVR_SetDVRConfig(_userId,1031,_channelId,ptr,(UInt32)size);//设置配置信息Marshal.FreeHGlobal(ptr);//释放指针说明:可以叠加显示多个字符串。13.球机定位速度设置1)设备配置命令3270;//获取PTZ基本参数信息3271;//设置PTZ基本参数信息2)通道号或者组号ChannelId//登录IPC设备时获取的通道号3)获取配置信息Hik.NET_DVR_PTZ_BASICPARAMCFGbasicParamCfg=newHik.NET_DVR_PTZ_BASICPARAMCFG();//初始化PTZ基本参数结构体Int32size=Marshal.SizeOf(basicParamCfg);//获取结构体空间大小IntPtrptr=Marshal.AllocHGlobal(size);//设置指针大小Hik.NET_DVR_GetDVRConfig(userId,3270,_channelId,ptr,(UInt32)size,refbytesReturned);//获取配置参数指针basicParamCfg=(Hik.NET_DVR_PTZ_BASICPARAMCFG)Marshal.PtrToStructure(ptr,typeof(Hik.NET_DVR_PTZ_BASICPARAMCFG));//指针转换为结构体Marshal.FreeHGlobal(ptr);//释放指针4)球机定位速度命令1-85)球机定位速度结构体Hik.NET_DVR_PTZ_BASICPARAMCFGbasicParamCfg6)设置配置信息Hik.NET_DVR_PTZ_BASICPARAMCFGbasicParamCfg=获取配置信息();Int32size=Marshal.SizeOf(basicParamCfg);//获取结构体空间大小IntPtrptr=Marshal.AllocHGlobal(size);//设置指针空间大小basicParamCfg.byPresetSpeed=(byte)速度值;Marshal.StructureToPtr(basicParamCfg,ptr,false);//结构体转换为指针Hik.NET_DVR_SetDVRConfig(userId,3271,_channelId,ptr,size);//设置配置信息Marshal.FreeHGlobal(ptr);//释放指针14.获取球机转动范围1)设备配置命令294;//云台获取PTZ范围2)通道号或者组号ChannelId//登录IPC设备时获取的通道号3)获取配置信息Hik.NET_DVR_PTZSCOPEPTZScope=newHik.NET_DVR_PTZSCOPE();//初始化球机范围信息结构体Int32size=Marshal.SizeOf(PTZScope);//获取结构体空间大小IntPtrptrScope=Marshal.AllocHGlobal(size);//设置指针空间大小Hik.NET_DVR_GetDVRConfig(_userId,294,_channelId,ptrScope,(UInt32)size,refresult);//获取配置信息PTZScope=(Hik.NET_DVR_PTZSCOPE)Marshal.PtrToStructure(ptrScope,typeof(Hik.NET_DVR_PTZSCOPE));//指针转换为结构体Marshal.FreeHGlobal(ptrScope);//释放指针4)球机转动范围结构体Hik.NET_DVR_PTZSCOPEPTZScope15.球机定位使用球机定位功能前,需先设置球机定位速度和获取球机转动范围,再根据球机转动范围信息来操作球机定位功能。1)设备配置命令292;//云台设置PTZ位置293;//云台获取PTZ位置2)通道号或者组号ChannelId//登录IPC设备时获取的通道号3)获取配置信息//用精简方式实现Int32size=Marshal.SizeOf(typeof(Hik.NET_DVR_PTZPOS));//获取球机位置信息结构体大小IntPtrptrPTZ=Marshal.AllocHGlobal(size);//设置指针空间大小Hik.NET_DVR_GetDVRConfig(_userId,293,_channelId,ptrPTZ,(UInt32)size,refresult);//获取球机位置配置信息Hik.NET_DVR_PTZPOSPTZPos=(Hik.NET_DVR_PTZPOS)Marshal.PtrToStructure(ptrPTZ,typeof(Hik.NET_DVR_PTZPOS));//指针转换为结构体Marshal.FreeHGlobal(ptrPTZ);//释放指针4)透雾切换结构体Hik.NET_DVR_PTZPOSPTZPos5)设置配置信息Hik.NET_DVR_PTZPOSPTZPos=获取球机位置信息();Int32size=Marshal.SizeOf(PTZPos);//获取结构体空间大小IntPtrptr=Marshal.AllocHGlobal(size);//设置指针空间大小PTZPos.wAction=1;//-表示定位PTZ参数//本结构体中的wAction参数是设置时的操作类型,因此获取时该参数无效。实际显示的PTZ值是获取到的十六进制值的十分之一,如获取的水平参数P的值是0x1750,实际显示的P值为175度;获取到的垂直参数T的值是0x0789,实际显示的T值为78.9度;获取到的变倍参数Z的值是0x1100,实际显示的Z值为110度。Stringtemp="0x"+Convert.ToString(horAngle*10);//实际显示的PTZ值是获取到的十六进制值的十分之一,所以需要把输入的数值乘以10再拼成十六进制字符串PTZPos.wPanPos=Convert.ToUInt16(temp,16);//转换为16进制水平角度if(pitAngle>=0)//判断俯仰角度的正负。由于零方位角的设置不同,会导致出现负的俯仰角度,所以处理方式不同PTZPos.wTiltPos=Convert.ToUInt16("0x"+Convert.ToString(pitAngle*10),16);elsePTZPos.wTiltPos=Convert.ToUInt16("0x"+Convert.ToString((pitAngle+360)*10),16);PTZPos.wZoomPos=Convert.ToUInt16("0x"+Convert.ToString(viewAngle*10),16);Marshal.StructureToPtr(PTZPos,ptr,false);//结构体转换为指针Hik.NET_DVR_SetDVRConfig(_userId,292,_channelId,ptr,(uint)size);//设置配置Marshal.FreeHGlobal(ptr);//释放指针16.零方位角控制1)设备配置命令3283;//零方位角控制2)通道号或者组号ChannelId//登录IPC设备时获取的通道号3)零方位角控制命令SET=0,//设置GOTO=1,//调用CLE=2//清除4)零方位角控制结构体Hik.NET_DVR_INITIALPOSITIONCTRLinitialPositionCtrl5)设置控制信息Hik.NET_DVR_INITIALPOSITIONCTRLinitialPositionCtrl=newHik.NET_DVR_INITIALPOSITIONCTRL();//初始化零方位角控制结构体Int32size=Marshal.SizeOf(initialPositionCtrl);//获取结构体空间大小IntPtrptr=Marshal.AllocHGlobal(size);//设置指针大小initialPositionCtrl.dwSize=(uint)size;//结构体大小initialPositionCtrl.dwChan=(uint)_channelId;//播放通道号initialPositionCtrl.byWorkMode=(byte)command;//零方位角控制命令Marshal.StructureToPtr(initialPositionCtrl,ptr,false);//结构体转换为指针Hik.NET_DVR_RemoteControl(_userId,(uint)3283,ptr,(uint)size);//零方位角控制Marshal.FreeHGlobal(ptr);//释放指针17.录像回放此功能需要硬盘录像机支持。需要先登录NVR设备。在登录和获取数字通道号后,根据设备所对应的通道号操作相关IPC设备的一些基础功能。1)设备配置命令1;//开始播放2;//停止播放3;//暂停播放4;//恢复播放5;//快放6;//慢放7;//正常速度8;//单帧放9;//打开声音10;//关闭声音11;//调节音量12;//改变文件回放的进度13;//获取文件回放的进度14;//获取当前已经播放的时间(按文件回放的时候有效)15;//获取当前已经播放的帧数(按文件回放的时候有效)16;//获取当前播放文件总的帧数(按文件回放的时候有效)17;//获取当前播放文件总的时间(按文件回放的时候有效)20;//丢B帧24;//设置码流速度25;//保持与设备的心跳(如果回调阻塞,建议2秒发送一次)26;//按绝对时间定位27;//获取按时间回放对应时间段内的所有文件的总长度29;//倒放切换为正放30;//正放切换为倒放32;//设置转封装类型33;//正放切换为倒放2)初始化录像回放结构体Hik.NET_DVR_VOD_PARAstruVodPara=newHik.NET_DVR_VOD_PARA();//初始化录像回放结构体struVodPara.dwSize=(uint)Marshal.SizeOf(struVodPara);//获取结构体空间大小struVodPara.struIDInfo.dwChannel=(uint)_ipChannelId;//数字通道号Channelnumber,海康设备数字通道号从33开始//struVodPara.hWnd=this.pictureBoxVideo.Handle;//不使用回调获取回放视频时,使用此属性设置回放窗口句柄struVodPara.hWnd=IntPtr.Zero;//使用回调获取回放视频时,需如此设置回放窗口句柄//设置回放的开始时间SetthestartingtimetosearchvideofilesstruVodPara.struBeginTime.dwYear=(uint)dateTimeStart.Value.Year;struVodPara.struBeginTime.dwMonth=(uint)dateTimeStart.Value.Month;struVodPara.struBeginTime.dwDay=(uint)dateTimeStart.Value.Day;struVodPara.struBeginTime.dwHour=(uint)dateTimeStart.Value.Hour;struVodPara.struBeginTime.dwMinute=(uint)dateTimeStart.Value.Minute;struVodPara.struBeginTime.dwSecond=(uint)dateTimeStart.Value.Second;//设置回放的结束时间SetthestoppingtimetosearchvideofilesstruVodPara.struEndTime.dwYear=(uint)dateTimeEnd.Value.Year;struVodPara.struEndTime.dwMonth=(uint)dateTimeEnd.Value.Month;struVodPara.struEndTime.dwDay=(uint)dateTimeEnd.Value.Day;struVodPara.struEndTime.dwHour=(uint)dateTimeEnd.Value.Hour;struVodPara.struEndTime.dwMinute=(uint)dateTimeEnd.Value.Minute;struVodPara.struEndTime.dwSecond=(uint)dateTimeEnd.Value.Second;3)获取录像回放播放句柄目前根据需求只实现根据录像起止时间范围播放录像视频,其他功能请参考SDK功能说明文档。//按时间回放Playbackbytime_realHandle=Hik.NET_DVR_PlayBackByTime_V40(_NVRUserId,refstruVodPara);//struVodPara为录像回放结构体4)录像数据回调函数的使用///<summary>///录像数据回调函数///</summary>///<paramname="lPlayHandle">当前的录像播放句柄</param>///<paramname="dwDataType">数据类型</param>///<paramname="pBuffer">存放数据的缓冲区指针</param>///<paramname="dwBufSize">缓冲区大小</param>///<paramname="pUser">用户数据</param>publicdelegatevoidPlayDataCallBack_V40(Int32lPlayHandle,UInt32dwDataType,IntPtrpBuffer,UInt32dwBufSize,IntPtrpUser);此回调函数的使用方式与实时流回调函数的操作方式类似,都是获取视频流后,用播放库解码,返回角度信息和解码后的视频流。Hik.NET_DVR_PlayBackControl_V40(_realHandle,1,IntPtr.Zero,0,IntPtr.Zero,refiOutValue);//播放录像回放视频5)停止录像回放Hik.NET_DVR_StopPlayBack(_realHandle)18.录像下载1)初始化录像下载结构体Hik.NET_DVR_PLAYCONDstruDownPara=newHik.NET_DVR_PLAYCOND();//初始化录像下载结构体struDownPara.dwChannel=(uint)_ipChannelId;//数字通道号Channelnumber//设置下载的开始时间SetthestartingtimestruDownPara.struStartTime.dwYear=(uint)dateTimeStart.Value.Year;struDownPara.struStartTime.dwMonth=(uint)dateTimeStart.Value.Month;struDownPara.struStartTime.dwDay=(uint)dateTimeStart.Value.Day;struDownPara.struStartTime.dwHour=(uint)dateTimeStart.Value.Hour;struDownPara.struStartTime.dwMinute=(uint)dateTimeStart.Value.Minute;struDownPara.struStartTime.dwSecond=(uint)dateTimeStart.Value.Second;//设置下载的结束时间SetthestoppingtimestruDownPara.struStopTime.dwYear=(uint)dateTimeEnd.Value.Year;struDownPara.struStopTime.dwMonth=(uint)dateTimeEnd.Value.Month;struDownPara.struStopTime.dwDay=(uint)dateTimeEnd.Value.Day;struDownPara.struStopTime.dwHour=(uint)dateTimeEnd.Value.Hour;struDownPara.struStopTime.dwMinute=(uint)dateTimeEnd.Value.Minute;struDownPara.struStopTime.dwSecond=(uint)dateTimeEnd.Value.Second;2)录像下载结构体Hik.NET_DVR_PLAYCONDstruDownPara3)录像下载录像下载后默认保存格式为mp4。_realHandle=Hik.NET_DVR_GetFileByTime_V40(_NVRUserId,sVideoFileName,refstruDownPara);Plat_SDK编程指南海康平台可以挂载多个NVR设备,调用NVR下挂载的IPC设备时,只需要在海康平台的设备设置中找到其摄像头ID即可。(一)SDK的引用具体引用方式,参见IPC_SDK的引用。由于海康平台技术人员提供的DLL文件过于繁杂,就不一一列出DLL的说明,详情参见IVMS_SDK文件夹目录。(二)C#程序调用DLL中的非托管函数方法详情参见C#程序调用DLL中的非托管函数方法。(三)SDK的调用根据海康视频设备及平台使用的方案设计,只应用海康平台SDK的视频回调显示功能,其它功能暂不使用。对Plat_SDK的C#封装类见附件HikIVMS.cs,可参考此基础类文件进行程序功能编写。1.获取错误码Plat_GetLastError(_userId);//获取错误码,userId为登录后获得的用户ID使用方式:如果每个非托管函数方法返回结果不为0(正确),则调用此方法获取错误码。例如:Int32ret=Plat_Init();if(ret!=0)thrownewHikIVMSException(Plat_GetLastError(_userId));//HikIVMSException为自定义异常调用类,用来解析错误码抛出异常2.登录1)用户注册Int32ret;ret=Plat_Init();//platformSDK初始化if(ret!=0)thrownewHikIVMSException(Plat_GetLastError(_userId));IntPtrptrIP=Marshal.StringToHGlobalAnsi(uri.Host);//IPIntPtrptrUserName=Marshal.StringToHGlobalAnsi(a[0]);//用户名IntPtrptrPassword=Marshal.StringToHGlobalAnsi(a[1]);//密码IntPtrptrPort=Marshal.StringToHGlobalAnsi(uri.Port.ToString());//端口号_userId=Plat_LoginCMS(ptrIP,ptrUserName,ptrPassword,ptrPort,0);//登录//释放指针Marshal.FreeHGlobal(ptrIP);Marshal.FreeHGlobal(ptrUserName);Marshal.FreeHGlobal(ptrPassword);Marshal.FreeHGlobal(ptrPort);2)用户注销//如果存在播放的视频,也就是_streamHandle播放句柄>0,则先停止播放视频Plat_StopVideo(_streamHandle);Plat_LogoutCMS(_userId);//注销用户Plat_Free();//释放SDK,必须执行3.预览1)播放预览///<summary>///播放实时视频(开始预览/回放)///</summary>///<paramname="url">预览或回放的播放路径,由Plat_QueryRealStreamURL或Plat_QueryRecordFile</param>///<paramname="hWnd">播放窗口句柄,如果为空,则不播放</param>///<paramname="userHandle">用户ID</param>///<paramname="streamCallback">视频码流接收回调函数指针,如果回调函数为NULL则不给码流</param>///<returns>>=0成功,返回实时视频句柄,错误时返回-1</returns>Int32Plat_PlayVideo(Stringurl,IntPtrhWnd,Int32userHandle,fStreamCallbackstreamCallback,IntPtruser);例如:_streamHandle=Plat_PlayVideo(cameraId,IntPtr.Zero,_userId,callback,IntPtr.Zero);注意:此函数的第一个参数,在应用中只需要传入摄像机ID即可。2)实时流回调函数的使用///<summary>///实时流回调///</summary>///<paramname="handle">Plat_PlayVideo返回的句柄</param>///<paramname="data">接收视频码流数据缓冲区指针</param>///<paramname="size">接收视频码流数据字节数</param>///<paramname="user">用户数据</param>publicdelegatevoidfStreamCallback(Int32handle,IntPtrdata,UInt32size,IntPtruser,UInt32dataType);其调用方式与IPC_SDK中回调实时视频流的方式相同,都是调用播放库解码,然后返回角度信息和解码后的视频。详情参见IPC_SDK预览功能说明示例如下:privateHikIVMS.fStreamCallback_callback;privateHikIVMS.DECCBFUN_displayCallback;//解码回调privateHikIVMS.ADDITIONDATACBFUN_additionDataDisplayCallback;//角度回调if(_callback==null)_callback=newHikIVMS.fStreamCallback(StreamCallback);if(_displayCallback==null)_displayCallback=newHikIVMS.DECCBFUN(DecCallbackFUN);if(_additionDataDisplayCallback==null)_additionDataDisplayCallback=newHikIVMS.ADDITIONDATACBFUN(AdditionDataCallBackFUN);Hik.Play(cameraCode,_callback);注意:Plat的回调函数与IPC回调函数中唯一的区别在于数据类型的定义不同,IPC的系统头数据类型为1,视频流数据类型为2;Plat系统头数据类型为0,视频流数据类型为1,仅此区别,其它相同。

© 一点知识