EasyCVR需要添加大华摄像头的预置点,并实现预置点的增删改查。查看文档可以获得对应的接口,大华SDK设置、删除和移动预置点接口如下:
/************************************************************************
** 对应CLIENT_DHPTZControlEx接口
***********************************************************************/
以下是大华SDK获取和改变预置点接口:
/************************************************************************
** 配置命令 对应CLIENT_GetNewDevConfig和CLIENT_SetNewDevConfig接口
***********************************************************************/
#define CFG_CMD_PTZ_PRESET "PtzPreset" // 云台预置点配置(对应结构 PTZ_PRESET_INFO)
// 云台预置点配置对应结构
typedef struct tagPTZ_PRESET_INFO
{
DWORD dwMaxPtzPresetNum; // 最大预置点个数
DWORD dwRetPtzPresetNum; // 实际使用预置点个数
PTZ_PRESET *pstPtzPreset; // 预置点信息(根据最大个数申请内存)
}PTZ_PRESET_INFO;
// 云台控制预置点结构
typedef struct tagPTZ_PRESET
{
BOOL bEnable; // 该预置点是否生效
char szName[MAX_PTZ_PRESET_NAME_LEN]; // 预置点名称
CFG_PTZ_SPACE_UNIT stPosition; // 预置点的坐标和放大倍数
}PTZ_PRESET;
// 云台控制坐标单元
typedef struct tagCFG_PTZ_SPACE_UNIT
{
int nPositionX; //云台水平运动位置,有效范围:[0,3600]
int nPositionY; //云台垂直运动位置,有效范围:[-1800,1800]
int nZoom; //云台光圈变动位置,有效范围:[0,128]
}CFG_PTZ_SPACE_UNIT;
上面已经知道每个预置点所对应的接口,下面就是用来实现这些接口用来控制云台操作。
因为设置、删除和移动都是相同的接口调用,所以写一个函数实现这三个接口:
int Dahua_Preset_Operate(LLONG handle, int channelNum, DH_PTZ_ControlType cmd, int param2) {
BOOL bRet = CLIENT_DHPTZControlEx(handle, channelNum, cmd, 0, (long)param2, 0, FALSE);
if (bRet == FALSE) {
return EasyGetLastError();
}
return 0;
}
添加、删除和移动预置点:
上面的预置点都比较简单,最麻烦的还是修改预置点里面的信息。
修改预置点里面的信息必须要先获取预置点信息,在进行修改,所以这二个基本是一套。
获取预置点信息:
int get_err = 0;
const int len = 256 * 1024;
char get_info[len] = { 0 };
BOOL ret = CLIENT_GetNewDevConfig(handle, CFG_CMD_PTZ_PRESET, -1, get_info, len, &get_err, 10 * 1000);
获取预置点信息需要注意几点:
1、第三个参数为-1
2、第四个参数必须要分配内存和传入char类型,最后释放char资源
3、最后一个参数不能太小,否则获取失败,方法返回FALSE
4、第四个参数是json格式
设置预置点信息(本人只设置预置点名称):
BOOL bRet = CLIENT_SetNewDevConfig(handle, CFG_CMD_PTZ_PRESET, -1, get_info, strlen(get_info), NULL, NULL, 10 * 1000);
也要注意以下几点:
1、第三个参数为-1
2、第四个参数必须要分配内存和传入char类型,最后释放char资源,传入是json格式
3、获取到的预置点信息,可以保存文件查看(里面是二维数组)
Enable: true是已经有预置点
Name: 预置点名称
Position: 预置点坐标
4、修改预置点信息也需要二维数组,否则修改不成功,并将原来的预置点在浏览器显示不出来
下图是将原来的ch变量在加一个维度的数组(这个比较重要,不加上否则修改不成功)