公司的项目需要海康威视网络摄像头的二次开发, 选用的二次开发DEMO并成功运行demo之后,预览图像中如果有移动物体,就会显示绿色的方块格状区域,下面给大家提供2种方案解决.
方案一 (这种是隐藏绿色方块格,移动侦测功能还在)
调用NET_DVR_RealPlay_V40传窗口句柄直接预览默认显示该叠加信息,此时调用NET_DVR_GetRealPlayerIndex获取播放库句柄,然后调用播放库接口PlayM4_RenderPrivateData(该接口调用请参考播放库SDK编程指南)可以控制显示或者取消显示。
具体代码附上:
MonitorHaiKangNew *pHK = (__bridge MonitorHaiKangNew*)pUser;
if (pHK.isSoundOn) {
nPreviewPort = 1;
}else{
nPreviewPort = 0;
}
NET_DVR_PREVIEWINFO struPreviewInfo = {0};
struPreviewInfo.lChannel = iStartChan + iIndex;
struPreviewInfo.dwStreamType = dwStreamType;//0-主码流,1-子码流,2-码流3,3-码流4
struPreviewInfo.bBlocked = 1;
struPreviewInfo.hPlayWnd = (__bridge HWND)pView;
g_structHandle[iIndex].iPreviewID = NET_DVR_RealPlay_V40(iUserID, &struPreviewInfo,NULL,NULL);
//!移动侦测祛除三步走
int m_iPort = NET_DVR_GetRealPlayerIndex(iUserID);
NET_DVR_GetRealPlayerIndex(g_structHandle[iIndex].iPreviewID);
PlayM4_RenderPrivateData(m_iPort, PLAYM4_RENDER_MD, 0);
if (g_structHandle[iIndex].iPreviewID == -1)
{
NSLog(@"NET_DVR_RealPlay_V40 failed:%d", NET_DVR_GetLastError());
return -1;
}
else{
if(!NET_DVR_SetStandardDataCallBack(g_structHandle[iIndex].iPreviewID, g_fStdDataCallBack, iIndex))
{
NSLog(@"NET_DVR_SetStandardDataCallBack failed:%d", NET_DVR_GetLastError());
}
}
方案2 (这种是即隐藏绿色方块格又关闭移动侦测功能)
通过NET_DVR_GetDVRConfig(命令:NET_DVR_GET_PICCFG_V40)、NET_DVR_SetDVRConfig(命令:NET_DVR_SET_PICCFG_V40)获取和设置,其中的移动侦测参数NET_DVR_PICCFG_V40-->NET_DVR_MOTION_V40里面的byEnableDisplay设置为0即可,也可以WEB或者或者客户端软件登录设备进配置界面直接手动设置取值动态显示,代码如下:
//!关闭移动侦测
NET_DVR_PICCFG_V40m_struPicCfgV40 = {0};
uintdwSize =sizeof(m_struPicCfgV40);
uintdwReturn =0;
intiGroupNo =channel;
if(!NET_DVR_GetDVRConfig(m_lUserID,NET_DVR_GET_PICCFG_V40, iGroupNo, &m_struPicCfgV40, dwSize, &dwReturn)) {
uintiLastErr =NET_DVR_GetLastError();
//获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code
printf("NET_DVR_SET_PICCFG_V40 failed, error code= %d\n", iLastErr);
}else{
m_struPicCfgV40.struMotion.byEnableDisplay=1;
m_struPicCfgV40.struMotion.byEnableHandleMotion=1;
// m_struPicCfgV40.struMotion.byMotionScope = 0;
if(!NET_DVR_SetDVRConfig(m_lUserID,NET_DVR_SET_PICCFG_V40, iGroupNo, &m_struPicCfgV40, dwSize))
{
uintiLastErr =NET_DVR_GetLastError();
printf("NET_DVR_SET_PICCFG_V40 failed, error code= %d\n", iLastErr);
}else{
//NET_DVR_SET_PICCFG_V40配置成功! iGroupNo
NET_DVR_GetDVRConfig(m_lUserID,NET_DVR_GET_PICCFG_V40, iGroupNo, &m_struPicCfgV40, dwSize, &dwReturn);
}
}
这2种方法看项目需求自己选择
常见报错误码 :
4 通道号错误。设备没有对应的通道号。 需要正确的通道号
17 参数错误。SDK 接口中给入的输入或输出参数为空。
其他错误可以参考 SDK文档<错误代码及说明>