#include #include #include #include //#include "Windows.h" #include "HCNetSDK.h" #include using namespace std; #define XML_BUF 3*1024*1024 void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser) { char tempbuf[256] = {0}; switch(dwType) { case EXCEPTION_RECONNECT: // 预览时重连 printf("----------reconnect--------%d\n", time(NULL)); break; default: break; } } int main() { DWORD dwRet; NET_DVR_Init(); NET_DVR_SetConnectTime(2000, 1); NET_DVR_SetReconnect(10000, true); NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL); LONG lUserID; NET_DVR_DEVICEINFO_V30 struDeviceInfo; lUserID = NET_DVR_Login_V30("192.168.1.101", 8000, "admin", "a1234567", &struDeviceInfo); if (lUserID < 0) { printf("NET_DVR_Login_V30 failed, err: %d\n", NET_DVR_GetLastError()); NET_DVR_Cleanup(); return -1; } //DWORD dwWallNo = 1 << 24; // ////--------------------------------------- //// 获取电视墙显示输出位置,获取4个屏幕信息 //DWORD m_dwDispNum=4; //DWORD m_lDispChan[4]; //显示输出号,通过NET_DVR_GET_VIDEOWALLDISPLAYNO获取 //m_lDispChan[0]= 0x01000001; //m_lDispChan[1]= 0x01000002; //m_lDispChan[2]= 0x01000003; //m_lDispChan[3]= 0x01000004; //DWORD m_dwStatus[4]; //NET_DVR_VIDEOWALLDISPLAYPOSITION m_struWallDispPos[4]; //memset(m_dwStatus, 0, sizeof(m_dwStatus)); //memset(m_struWallDispPos, 0, sizeof(m_struWallDispPos)); //if (!NET_DVR_GetDeviceConfig(lUserID, NET_DVR_GET_VIDEOWALLDISPLAYPOSITION, m_dwDispNum, m_lDispChan, sizeof(DWORD) * m_dwDispNum, // m_dwStatus, m_struWallDispPos, m_dwDispNum* sizeof(NET_DVR_VIDEOWALLDISPLAYPOSITION))) { // printf("NET_DVR_GET_VIDEOWALLDISPLAYPOSITION failed, err: %d\n", NET_DVR_GetLastError()); //} // ////--------------------------------------- ////设置电视墙显示输出位置, 设置4个显示屏幕在电视墙上的位置 //m_struWallDispPos[0].byEnable=1; //m_struWallDispPos[0].dwVideoWallNo= dwWallNo; //m_struWallDispPos[0].struRectCfg.dwXCoordinate=0; //m_struWallDispPos[0].struRectCfg.dwYCoordinate=0; // //m_struWallDispPos[1].byEnable=1; //m_struWallDispPos[1].dwVideoWallNo= dwWallNo; //m_struWallDispPos[1].struRectCfg.dwXCoordinate=1920; //m_struWallDispPos[1].struRectCfg.dwYCoordinate=0; // //m_struWallDispPos[2].byEnable=1; //m_struWallDispPos[2].dwVideoWallNo= dwWallNo; //m_struWallDispPos[2].struRectCfg.dwXCoordinate=0; //m_struWallDispPos[2].struRectCfg.dwYCoordinate=1080; // //m_struWallDispPos[3].byEnable=1; //m_struWallDispPos[3].dwVideoWallNo= dwWallNo; //m_struWallDispPos[3].struRectCfg.dwXCoordinate=1920; //m_struWallDispPos[3].struRectCfg.dwYCoordinate=1080; // //if (!NET_DVR_SetDeviceConfig(lUserID, NET_DVR_SET_VIDEOWALLDISPLAYPOSITION, m_dwDispNum, m_lDispChan,sizeof(DWORD) * m_dwDispNum, // m_dwStatus, m_struWallDispPos, m_dwDispNum* sizeof(NET_DVR_VIDEOWALLDISPLAYPOSITION))) { // printf("NET_DVR_SET_VIDEOWALLDISPLAYPOSITION failed, err: %d\n", NET_DVR_GetLastError()); //} //--------------------------------------- //获取电视墙窗口参数 //DWORD m_dwWinCount; //窗口个数 //char *pTemp = new char[4 + 256 *sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION)]; //memset(pTemp, 0, 4 + 256 *sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION)); //获取电视墙所有窗口信息,只需传电视墙号 //if (!NET_DVR_GetDeviceConfig(lUserID, NET_DVR_GET_VIDEOWALLWINDOWPOSITION, 0xffffffff, &dwWallNo, sizeof(DWORD), NULL, // pTemp, 4 + 256 *sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION))) { // printf("NET_DVR_GET_VIDEOWALLWINDOWPOSITION error, err: %d\n", NET_DVR_GetLastError()); //} //m_dwWinCount = *((DWORD*)pTemp); //printf("m_dwWinCount=%d\n", m_dwWinCount); //返回的前4个字节为窗口个数delete []pTemp; //--------------------------------------- //设置电视墙窗口参数,即开窗,坐标在电视墙范围之内 DWORD m_dwWinCount=1; //开两个窗口 DWORD m_dwWinNum[1]; //1字节墙号+ 1字节保留+ 2字节窗口号m_dwWinNum[0] = 1<<24; //开窗时窗口号为0 m_dwWinNum[0] = 1<<24; NET_DVR_VIDEOWALLWINDOWPOSITION m_struWinPos[1]; memset(m_struWinPos, 0, sizeof(m_struWinPos)); m_struWinPos[0].dwSize=sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION); m_struWinPos[0].byEnable=1; m_struWinPos[0].struRect.dwXCoordinate=100; m_struWinPos[0].struRect.dwYCoordinate=100; m_struWinPos[0].struRect.dwWidth=1720; m_struWinPos[0].struRect.dwHeight=1720; //m_struWinPos[1].dwSize=sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION); //m_struWinPos[1].byEnable=1; //m_struWinPos[1].struRect.dwXCoordinate=1920; //m_struWinPos[1].struRect.dwYCoordinate=1920; //m_struWinPos[1].struRect.dwWidth=800; //m_struWinPos[1].struRect.dwHeight=600; DWORD m_dwWinStatus[1]; DWORD dwRetWinNum[1]; //开窗时窗口号由设备返回 NET_DVR_IN_PARAM struInputPapam = {0}; struInputPapam.struCondBuf.pBuf = &m_dwWinNum; //输入条件缓冲区 struInputPapam.struCondBuf.nLen = m_dwWinCount * sizeof(DWORD); struInputPapam.dwRecvTimeout = 5000; //接收超时时间 struInputPapam.struInParamBuf.pBuf = m_struWinPos; struInputPapam.struInParamBuf.nLen = m_dwWinCount * sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION); NET_DVR_OUT_PARAM struOutputPapam = {0}; struOutputPapam.lpStatusList = m_dwWinStatus; struOutputPapam.struOutBuf.pBuf = dwRetWinNum; struOutputPapam.struOutBuf.nLen = m_dwWinCount*sizeof(DWORD); if (!NET_DVR_SetDeviceConfigEx(lUserID, NET_DVR_SET_VIDEOWALLWINDOWPOSITION, m_dwWinCount, &struInputPapam, &struOutputPapam)) { printf("NET_DVR_SET_VIDEOWALLWINDOWPOSITION error, err: %d\n", NET_DVR_GetLastError()); } //前端设备 动态解码 NET_DVR_PU_STREAM_CFG_V41 m_struDynamicInfo= {0}; m_struDynamicInfo.dwSize=sizeof(m_struDynamicInfo); m_struDynamicInfo.byStreamMode=1; strcpy((char *)m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.byAddress, "192.168.1.63"); m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.wDVRPort=8000; strcpy((char *)m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.sUserName,"admin"); strcpy((char *)m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.sPassword,"admin12345"); m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.byChannel=1; m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.byFactoryType=0; //int byWallNo=1,dwSubWinNo=1,dwWinNo=1; DWORD dwDecChanNum=0x01000002; //DWORD dwDecChanNum=(byWallNo << 24) | (dwSubWinNo<<16) |dwWinNo; //1字节墙号+1字节子窗口号+2字节窗口号: (byWallNo << 24) | (dwSubWinNo<<16) |dwWinNo; if (!NET_DVR_MatrixStartDynamic_V41(lUserID, dwDecChanNum, &m_struDynamicInfo)) { printf("NET_DVR_MatrixStartDynamic_V41 error, err: %d\n", NET_DVR_GetLastError()); } /*char logobuf[50000]; NET_DVR_GetDeviceAbility(lUserID,WALL_ABILITY,NULL,0,logobuf,50000); FILE * pFile; pFile = fopen ("./a.xml","w"); printf("----test open----\n"); if (pFile!=NULL) { printf("----test----%d\n",sizeof(pFile)); fwrite(logobuf, 1, sizeof(logobuf), pFile); fclose (pFile); } else perror ("Error opening file"); */ //开启警报 NET_DVR_SetAlarmOut(lUserID,0xff00,1); NET_DVR_DISP_LOGOCFG net_dvr_disp_logocfg1; net_dvr_disp_logocfg1.dwCorordinateX = 10; net_dvr_disp_logocfg1.dwCorordinateY = 10; net_dvr_disp_logocfg1.wPicWidth = 32; net_dvr_disp_logocfg1.wPicHeight = 32; net_dvr_disp_logocfg1.byRes1[4]=0; net_dvr_disp_logocfg1.byFlash = 1; net_dvr_disp_logocfg1.byTranslucent = 0; net_dvr_disp_logocfg1.byRes2[6]=0; net_dvr_disp_logocfg1.dwLogoSize=0; char logobuf[10000]; { FILE * pFile; pFile = fopen ("./ico.bmp","rb"); fseek(pFile,0,SEEK_END); int nFileLen = ftell(pFile); fseek(pFile,0,SEEK_SET); printf("----test open----,%d\n",nFileLen); if (pFile!=NULL) { printf("----test----\n"); net_dvr_disp_logocfg1.dwLogoSize = fread(logobuf, 1, nFileLen, pFile); fclose (pFile); } else perror ("Error opening file"); } if (!NET_DVR_UploadLogo(lUserID, 1, &net_dvr_disp_logocfg1, logobuf)) { printf("NET_DVR_UploadLogo error, err: %d\n", NET_DVR_GetLastError()); } if (!NET_DVR_LogoSwitch(lUserID, 1, NET_DVR_SHOWLOGO)) { printf("NET_DVR_LogoSwitch error, err: %d\n", NET_DVR_GetLastError()); } //if (!NET_DVR_MatrixStopDynamic(lUserID,dwDecChanNum)) { // printf("NET_DVR_MatrixStopDynamic error, err: %d\n", NET_DVR_GetLastError()); //} // NET_DVR_MatrixStopDynamic // NET_DVR_MatrixStopPassiveDecode //解除警报 NET_DVR_SetAlarmOut(lUserID,0xff00,0); //注销用户 NET_DVR_Logout(lUserID); //释放SDK资源 NET_DVR_Cleanup(); return 0; }