海康SDK编程指南

2025-10-17 21:57:55

1、IPC_SDK编程指南

3)        获取配置信息

Hik.NET_DVR_FOCUSMODE_CFG focusModeCfg = new Hik.NET_DVR_FOCUSMODE_CFG();//实例化聚焦模式结构体

Int32 size = Marshal.SizeOf(focusModeCfg);//获取结构体大小

IntPtr ptrCfg = Marshal.AllocHGlobal(size);//设置指针空间大小

Hik.NET_DVR_GetDVRConfig(_userId, 3305, _channelId, ptrCfg, (UInt32)size, ref dwReturn);//获取聚焦模式信息的指针

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_CFG

6)        设置配置信息

Hik.NET_DVR_FOCUSMODE_CFG focusModeCfg = 获取配置信息();

Int32 size = Marshal.SizeOf(focusModeCfg);//获取结构体大小

IntPtr ptrCfg = 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_V30 struShowStrCfg = new Hik.NET_DVR_SHOWSTRING_V30();//初始化叠加字符结构体

Int32 size = Marshal.SizeOf(struShowStrCfg);//获取结构体空间大小

IntPtr ptr = Marshal.AllocHGlobal(size);//设置指针大小

Hik.NET_DVR_GetDVRConfig(_userId, 1030, _channelId, ptr, (UInt32)size, ref dwReturn);//获宙闲取配置信息

struShowStrCfg = (Hik.NET_DVR_SHOWSTRING_V30)Marshal.PtrToStructure(ptr, typeof(Hik.NET_DVR_SHOWSTRING_V30));//指针转换为结构体

Marshal.FreeHGlobal(ptr);//释季欠哨放指针

4)        叠加字符结构体

NET_DVR_SHOWSTRINGINFO struStringInfo;/* 要显示的字符内容 */

说明:设置叠加字符需要为其属性赋值。

5)        设置配置信息

Hik.NET_DVR_SHOWSTRING_V30 struShowStrCfg =获取叠加字符配置信息();

Int32 size = Marshal.SizeOf(struShowStrCfg);//获取结构体空间大小

IntPtr ptr = Marshal.AllocHGlobal(size);//设置指针空间大小

String osd = "海康智能监控视频一";

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_BASICPARAMCFG basicParamCfg = new Hik.NET_DVR_PTZ_BASICPARAMCFG();//初始化PTZ基本参数结构体

Int32 size = Marshal.SizeOf(basicParamCfg);//获取结构体空间大小

IntPtr ptr = Marshal.AllocHGlobal(size);//设置指针大小

Hik.NET_DVR_GetDVRConfig(userId, 3270, _channelId, ptr, (UInt32)size, ref bytesReturned);//获取配置参数指针

basicParamCfg = (Hik.NET_DVR_PTZ_BASICPARAMCFG)Marshal.PtrToStructure(ptr, typeof(Hik.NET_DVR_PTZ_BASICPARAMCFG));//指针转换为结构体

Marshal.FreeHGlobal(ptr);//释放指针

4)        球机定位速度命令

1-8

5)        球机定位速度结构体

Hik.NET_DVR_PTZ_BASICPARAMCFG basicParamCfg

6)        设置配置信息

Hik.NET_DVR_PTZ_BASICPARAMCFG basicParamCfg = 获取配置信息();

Int32 size = Marshal.SizeOf(basicParamCfg);//获取结构体空间大小

IntPtr ptr = 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_PTZSCOPE PTZScope = new Hik.NET_DVR_PTZSCOPE();//初始化球机范围信息结构体

Int32 size = Marshal.SizeOf(PTZScope);//获取结构体空间大小

IntPtr ptrScope = Marshal.AllocHGlobal(size);//设置指针空间大小

Hik.NET_DVR_GetDVRConfig(_userId, 294, _channelId, ptrScope, (UInt32)size, ref result);//获取配置信息

PTZScope = (Hik.NET_DVR_PTZSCOPE)Marshal.PtrToStructure(ptrScope, typeof(Hik.NET_DVR_PTZSCOPE));//指针转换为结构体

Marshal.FreeHGlobal(ptrScope);//释放指针

4)        球机转动范围结构体

Hik.NET_DVR_PTZSCOPE PTZScope

15.    球机定位

使用球机定位功能前,需先设置球机定位速度和获取球机转动范围,再根据球机转动范围信息来操作球机定位功能。

1)        设备配置命令

292;//云台设置PTZ位置

293;//云台获取PTZ位置

2)        通道号或者组号

ChannelId//登录IPC设备时获取的通道号

3)        获取配置信息

//用精简方式实现

Int32 size = Marshal.SizeOf(typeof(Hik.NET_DVR_PTZPOS));//获取球机位置信息结构体大小

IntPtr ptrPTZ = Marshal.AllocHGlobal(size);//设置指针空间大小

Hik.NET_DVR_GetDVRConfig(_userId, 293, _channelId, ptrPTZ, (UInt32)size, ref result);//获取球机位置配置信息

Hik.NET_DVR_PTZPOS PTZPos = (Hik.NET_DVR_PTZPOS)Marshal.PtrToStructure(ptrPTZ, typeof(Hik.NET_DVR_PTZPOS));//指针转换为结构体

Marshal.FreeHGlobal(ptrPTZ);//释放指针

4)        透雾切换结构体

Hik.NET_DVR_PTZPOS PTZPos

5)        设置配置信息

Hik.NET_DVR_PTZPOS PTZPos = 获取球机位置信息();

Int32 size = Marshal.SizeOf(PTZPos);//获取结构体空间大小

IntPtr ptr = Marshal.AllocHGlobal(size);//设置指针空间大小

PTZPos.wAction = 1;//-表示定位PTZ参数

//本结构体中的wAction参数是设置时的操作类型,因此获取时该参数无效。实际显示的PTZ值是获取到的十六进制值的十分之一,如获取的水平参数P的值是0x1750,实际显示的P值为175度;获取到的垂直参数T的值是0x0789,实际显示的T值为78.9度;获取到的变倍参数Z的值是0x1100,实际显示的Z值为110度。

String temp = "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);

else

   PTZPos.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_INITIALPOSITIONCTRL initialPositionCtrl

5)        设置控制信息

Hik.NET_DVR_INITIALPOSITIONCTRL initialPositionCtrl = new Hik.NET_DVR_INITIALPOSITIONCTRL();//初始化零方位角控制结构体

Int32 size = Marshal.SizeOf(initialPositionCtrl);//获取结构体空间大小

IntPtr ptr = 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_PARA struVodPara = new Hik.NET_DVR_VOD_PARA();//初始化录像回放结构体

struVodPara.dwSize = (uint)Marshal.SizeOf(struVodPara);//获取结构体空间大小

struVodPara.struIDInfo.dwChannel = (uint)_ipChannelId; //数字通道号 Channel number,海康设备数字通道号从33开始  

//struVodPara.hWnd = this.pictureBoxVideo.Handle;//不使用回调获取回放视频时,使用此属性设置回放窗口句柄

 struVodPara.hWnd = IntPtr.Zero;//使用回调获取回放视频时,需如此设置回放窗口句柄

//设置回放的开始时间 Set the starting time to search video files

struVodPara.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;

//设置回放的结束时间 Set the stopping time to search video files

struVodPara.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功能说明文档。

//按时间回放 Playback by time

_realHandle = Hik.NET_DVR_PlayBackByTime_V40(_NVRUserId, ref struVodPara);// struVodPara为录像回放结构体

4)        录像数据回调函数的使用

/// <summary>

/// 录像数据回调函数 

/// </summary>

/// <param name="lPlayHandle">当前的录像播放句柄</param>

/// <param name="dwDataType">数据类型</param>

/// <param name="pBuffer">存放数据的缓冲区指针</param>

/// <param name="dwBufSize">缓冲区大小</param>

/// <param name="pUser">用户数据</param>

public delegate void PlayDataCallBack_V40(Int32 lPlayHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser);

此回调函数的使用方式与实时流回调函数的操作方式类似,都是获取视频流后,用播放库解码,返回角度信息和解码后的视频流。

Hik.NET_DVR_PlayBackControl_V40(_realHandle, 1, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue);//播放录像回放视频

5)        停止录像回放

Hik.NET_DVR_StopPlayBack(_realHandle)

18.    录像下载

1)        初始化录像下载结构体

Hik.NET_DVR_PLAYCOND struDownPara = new Hik.NET_DVR_PLAYCOND();//初始化录像下载结构体

struDownPara.dwChannel = (uint)_ipChannelId; //数字通道号 Channel number  

//设置下载的开始时间 Set the starting time

struDownPara.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;

//设置下载的结束时间 Set the stopping time

struDownPara.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_PLAYCOND  struDownPara

3)        录像下载

录像下载后默认保存格式为mp4。

_realHandle = Hik.NET_DVR_GetFileByTime_V40(_NVRUserId, sVideoFileName, ref struDownPara);

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(正确),则调用此方法获取错误码。

例如:

Int32 ret = Plat_Init();

if (ret != 0)

   throw new HikIVMSException(Plat_GetLastError(_userId));// HikIVMSException为自定义异常调用类,用来解析错误码抛出异常

2.        登录

1)        用户注册

Int32 ret;

ret = Plat_Init();//platformSDK初始化

if (ret != 0)

   throw new HikIVMSException(Plat_GetLastError(_userId));

IntPtr ptrIP = Marshal.StringToHGlobalAnsi(uri.Host);//IP

IntPtr ptrUserName = Marshal.StringToHGlobalAnsi(a[0]);//用户名

IntPtr ptrPassword = Marshal.StringToHGlobalAnsi(a[1]);//密码

IntPtr ptrPort = 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>

/// <param name="url">预览或回放的播放路径,由Plat_QueryRealStreamURL或Plat_QueryRecordFile</param>

/// <param name="hWnd">播放窗口句柄,如果为空,则不播放</param>

/// <param name="userHandle">用户ID</param>

/// <param name="streamCallback">视频码流接收回调函数指针,如果回调函数为NULL则不给码流</param>

/// <returns>>=0成功,返回实时视频句柄,错误时返回-1</returns>

Int32 Plat_PlayVideo(String url, IntPtr hWnd, Int32 userHandle, fStreamCallback streamCallback, IntPtr user);

例如:

_streamHandle = Plat_PlayVideo(cameraId, IntPtr.Zero, _userId, callback, IntPtr.Zero);

注意:此函数的第一个参数,在应用中只需要传入摄像机ID即可。

2)        实时流回调函数的使用

/// <summary>

/// 实时流回调

/// </summary>

/// <param name="handle">Plat_PlayVideo返回的句柄</param>

/// <param name="data">接收视频码流数据缓冲区指针</param>

/// <param name="size">接收视频码流数据字节数</param>

/// <param name="user">用户数据</param>

public delegate void fStreamCallback(Int32 handle, IntPtr data, UInt32 size, IntPtr user, UInt32 dataType);

其调用方式与IPC_SDK中回调实时视频流的方式相同,都是调用播放库解码,然后返回角度信息和解码后的视频。详情参见IPC_SDK预览功能说明

示例如下:

private HikIVMS.fStreamCallback _callback;

private HikIVMS.DECCBFUN _displayCallback;//解码回调

private HikIVMS.ADDITIONDATACBFUN _additionDataDisplayCallback;//角度回调

if (_callback == null)

_callback = new HikIVMS.fStreamCallback(StreamCallback);

if (_displayCallback == null)

 _displayCallback = new HikIVMS.DECCBFUN(DecCallbackFUN);

if (_additionDataDisplayCallback == null)

 _additionDataDisplayCallback = new HikIVMS.ADDITIONDATACBFUN(AdditionDataCallBackFUN);

Hik.Play(cameraCode, _callback);

注意:Plat的回调函数与IPC回调函数中唯一的区别在于数据类型的定义不同,IPC的系统头数据类型为1,视频流数据类型为2;Plat系统头数据类型为0,视频流数据类型为1,仅此区别,其它相同。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢