大家知道EasyCVR是TSINGSEE青犀视频开发的平台中支持协议最多的一款协议融合平台,EasyCVR能够兼容海康、大华的私有SDK,同时也具备GB28181、Ehome协议的级联、语音对讲等特点,我们接触的不少项目中,很多用户都会使用海康或者大华NVR的SDK来接入EasyCVR。
有的用户使用大华NVR接入EasyCVR期间,实际接入通道为10路,nvr可接入通道32路,登录成功后通过接口获取设备的通道信息,其中nChnNum 为nvr通道的接入能力32路。因此如果不添加判断接入的通道是否是有效通道的话,会造成很多无效通道占据通道信息的情况。
原本获取通道信息的代码如下:
//登录成功,获取通道信息
int nRetLen = 0;
NET_DEV_CHN_COUNT_INFO stuChn = { sizeof(NET_DEV_CHN_COUNT_INFO) };
stuChn.stuVideoIn.dwSize = sizeof(stuChn.stuVideoIn);
stuChn.stuVideoOut.dwSize = sizeof(stuChn.stuVideoOut);
if (CLIENT_QueryDevState(ret, DH_DEVSTATE_DEV_CHN_COUNT, (char*)&stuChn, stuChn.dwSize, &nRetLen))
{
nChnNum = stuChn.stuVideoIn.nMaxTotal;
}
else
{
nChnNum = stDevInfo.byChanNum;
}
我们对此代码进行修改,添加获取远端信息判断通道是否有效的部分,修改后的代码如下:
int index = 0;
//*channelSizes = nChnNum;
char names[DAHUA_CHANNEL_INFO_ARR_MAX_LEN][32] = {};
CLIENT_QueryChannelName(ret, names[0], 32 * DH_DEVSTATE_DEV_CHN_COUNT, &nChnNum);
//通道信息
if (lpChannels != NULL){
for (int i = 0; i < stDevInfo.byChanNum; i++){
if (i < DAHUA_CHANNEL_INFO_ARR_MAX_LEN){
//获取码流
const int channum = 1;
DWORD dwBitRate[channum] = { 0 };
int retlen = 0;
BOOL bRet = CLIENT_QueryRemotDevState(ret, DH_DEVSTATE_BITRATE, i, (char *)dwBitRate, channum*sizeof(DWORD), &retlen);
if (!bRet || retlen != channum*sizeof(DWORD)){
printf("[DAHUA SDK S] \r\n");
printf("[%s] DH_DEVSTATE_BITRATE bRet=%d,retlen=%d,chnNum=%d,sizeof()=%d \r\n", ip, bRet, retlen, nChnNum, sizeof(DHDEV_CHANNEL_CFG));
printf("[DAHUA SDK E] \r\n");
}
else{
printf("[DAHUA SDK S] \r\n");
printf("[%s] DH_DEV_CHANNELCFG dwBitRate=%d \r\n", ip, dwBitRate);
printf("[DAHUA SDK E] \r\n");
//strncpy(lpChannels->arr[i].name, names[i], 32);
memcpy(lpChannels->arr[index].name, names[i], 32);
lpChannels->arr[index].channelNum = i;
lpChannels->arr[index].online = 1;
index++;
}
}
else{
break;
}
}
}
*channelSizes = index;
此时当大华NVR接入EasyCVR后就可自动对无效通道进行筛选并剔除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。