ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TSINGSEE青犀视频接入大华摄像机实现改变预置点名称

2021-12-17 15:04:44  阅读:231  来源: 互联网

标签:预置 info ch strcat TSINGSEE PRESET 青犀 PTZ


TSINGSEE青犀视频可以接入不同协议的视频平台,海康大华皆可,近期我们在研究接入大华摄像机改变预置点名称的实现。下图是添加大华的预置点:

在使用网页添加预置点时,预置点标题是可以在网页双击改变。如果通过大华的SDK需要怎么去改变呢?在使用大华SDK去改变预置点标题,使用此函数(CLIENT_SetNewDevConfig)返回的是7,7在大华文档中是:用户参数不合法。

调用CLIENT_SetNewDevConfig函数查看文档得知:

在取文档查看szCommand参数,找到修改预置点标题的名称:

从文档中找到CFG_CMD_PTZ_PRESET宏定义,所对应的是PTZ_PRESET_INFO,里面有szName参数,此参数就是改变预置点标题:

下面是使用c++调用的修改预置点标题代码:

PTZ_PRESET_INFO info = { 0 };
int pNum = 0;
info.pstPtzPreset = (PTZ_PRESET *)malloc(sizeof(PTZ_PRESET) * MAX_PRESET);
memset(info.pstPtzPreset, 0x00, sizeof(PTZ_PRESET) * MAX_PRESET);
info.dwMaxPtzPresetNum = MAX_PRESET;
BOOL bRet = CLIENT_SetNewDevConfig(handle, CFG_CMD_PTZ_PRESET, -1, (char*)&info, sizeof(info), NULL, NULL, 10 * 1000);
free(info.pstPtzPreset);
if (bRet == FALSE) {
	int err = CLIENT_GetLastError() & (0x7fffffff);
	_EC(err);
	return EasyGetLastError();
}

上面代码调用bRet为FALSE,err的值是7,所以不是这么调用的。在查看文档中,CLIENT_SetNewDevConfig函数的第四个参数不是这么使用的,如下图:

由上可知第三个参数必须不能是结构体转char结构,否则会报用户参数不正确。解决问题也是要从新分配一个char结构:

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);//此参数是获取所有的预置点信息, CFG_CMD_PTZ_PRESET
PTZ_PRESET_INFO info = { 0 };
		int pNum = 0;
		info.pstPtzPreset = (PTZ_PRESET *)malloc(sizeof(PTZ_PRESET) * MAX_PRESET);
		memset(info.pstPtzPreset, 0x00, sizeof(PTZ_PRESET) * MAX_PRESET);
		info.dwMaxPtzPresetNum = MAX_PRESET;

注意:get_info值是json结构(找个c++的json分析库)。所以需要自己查看内存找到所需要修改的信息,下图是get_info信息:

最好别用官方的一个接口(CLIENT_PacketData(CFG_CMD_PTZ_PRESET, &info, sizeof(info), get_info, sizeof(get_info))),虽然CLIENT_GetNewDevConfig返回的是TRUE,进入到网页刷新预置点的使用居然没了。 本人做法是自己拼接字符,拼接一个json:

char ch[len] = {0};
		strcpy(ch, "[");
		for (int i = 0;i < table.size();i++)
		{
			value = table[i];
			if (value["Enable"].asBool()) {
float x = value["Position"][0].asFloat();
				float y = value["Position"][1].asFloat();
				float zoom = value["Position"][2].asFloat();
				if (strcmp(ch, "[")) {
					strcat(ch, ",");
				}
				strcat(ch, " {\"Enable\" : true, \"Name\" : ");
				if ((i + 1) == presetNum) {
					strcat(ch, "\"");
					strcat(ch, presetName);
					strcat(ch, "\"");
				}
				else
				{
					strcat(ch, "\"");
					strcat(ch, value["Name"].asCString());
					strcat(ch, "\"");
				}
				strcat(ch, ", \"Position\" : [ ");
				strcat(ch, std::to_string(x).c_str());
				strcat(ch, ", ");
				strcat(ch, std::to_string(y).c_str());
				strcat(ch, ", ");
				strcat(ch, std::to_string(zoom).c_str());
				strcat(ch, " ] }");
				continue;
			}
		}		
strcat(ch, " ]");

最后还是需要额外加个中括号,否则还是会出现7的错误码。

std::string _info = "[" + std::string(ch) + "]";
strcpy(get_info, _info.c_str());
BOOL bRet = CLIENT_SetNewDevConfig(handle, CFG_CMD_PTZ_PRESET, -1, get_info, strlen(get_info), NULL

标签:预置,info,ch,strcat,TSINGSEE,PRESET,青犀,PTZ
来源: https://www.cnblogs.com/TSINGSEE/p/15702315.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有