
0 简介Linux中使用海康相机sdk预览抓图使用c、QT1 导入海康SDK、头文件1.1 linux在pro文件中添加如下导入sdk库。要将海康的库原封不动的复制linux-*{LIBS-lhcnetsdk-lPlayCtrl-lAudioRender-lSuperRender}在头文件中包含头文件#ifdefWIN32#includehcnetsdk/win32/include/HCNetSDK.h#includehcnetsdk/win32/include/PlayM4.h#else#includehcnetsdk/linux64/include/HCNetSDK.h#includehcnetsdk/linux64/include/PlayM4.h#endif2 新建类类对象中新建private:intuserIdM;NET_DVR_DEVICEINFO deviceInfoM;intplayHandleM;LONG realPlayPortM;boolisStartDecodingPlay;变量名含义userIdM海康相机的句柄deviceInfoM海康相机的设备信息playHandleM海康相机的预览句柄realPlayPortM实时预览的播放库通道号isStartDecodingPlay判断是否开始播放3 登录登录相机intHkCameraMedia::login(QString ipAddrP,QString portP,QString userNameP,QString passwordP){interrorNET_DVR_NOERROR;QByteArrayipAddr(ipAddrP.toLatin1());QByteArrayuserName(userNameP.toLatin1());QByteArraypassword(passwordP.toLatin1());char*pszIpAddripAddr.data();char*pszUserNameuserName.data();char*pszPassowrdpassword.data();unsignedshortportportP.toUShort();qDebug(){ipAddrP}HkCameraMedia::login() BEGIN, ipAddrP: pszIpAddr, portP: port, userNameP: pszUserName, passwordP: pszPassowrd;do{if(falseNET_DVR_Init()){qDebug()[ipAddrP]HkCameraMedia::login(), failed to call NET_DVR_Init;errorNET_DVR_GetLastError();break;}if(falseNET_DVR_SetConnectTime(2000,0xFFFFFFFF)){qDebug()[ipAddrP]HkCameraMedia::login(), failed to call NET_DVR_SetConnectTime;errorNET_DVR_GetLastError();break;}if(falseNET_DVR_SetReconnect(10000)){qDebug()[ipAddrP]HkCameraMedia::login(), failed to call NET_DVR_SetReconnect;errorNET_DVR_GetLastError();break;}if(falseNET_DVR_SetExceptionCallBack_V30(0,NULL,NULL,NULL)){qDebug()[ipAddrP]HkCameraMedia::login(), failed to call NET_DVR_SetExceptionCallBack_V30;errorNET_DVR_GetLastError();break;}userIdMNET_DVR_Login(pszIpAddr,port,pszUserName,pszPassowrd,deviceInfoM);if(userIdM0){errorNET_DVR_GetLastError();qDebug()[ipAddrP]CameraMedia::connect(), failed to connect to camera, ip:ipAddrP,username: userNameP, password: passwordP, port: portP, error code: error;}}while(false);returnerror;}voidHkCameraMedia::logout(){if(userIdM0){NET_DVR_Logout(userIdM);NET_DVR_Cleanup();userIdM-1;}}4 开始预览4.1 开始预览时直接传入回调函数NET_DVR_RealPlay_V40(userId, struPlayInfo, fRealDataCallBackOfCapture, this);boolHkCameraMedia::startPreview(WId hPlayWndP,intplayHandlerP){boolretValfalse;intuserIdgetUserId();qDebug()HkCameraMedia::startPreview() BEGIN;do{// Q_ASSERT(hPlayWndP ! 0);NET_DVR_PREVIEWINFO struPlayInfo;memset(struPlayInfo,0,sizeof(struPlayInfo));struPlayInfo.hPlayWnd(HWND)hPlayWndP;//需要 SDK 解码时句柄设为有效值仅取流不解码时可设为空struPlayInfo.lChannel1;//预览通道号struPlayInfo.dwStreamType0;//0-主码流1-子码流2-码流 33-码流 4以此类推struPlayInfo.dwLinkMode0;//0- TCP 方式1- UDP 方式2- 多播方式3- RTP 方式4-RTP/RTSP5-RSTP/HTTPstruPlayInfo.bBlocked1;//0- 非阻塞取流1- 阻塞取流playHandlerPNET_DVR_RealPlay_V40(userId,struPlayInfo,fRealDataCallBackOfCapture,this);retVal(playHandlerP0)?true:false;if(retValfalse){LONG errorNoNET_DVR_NOERROR;char*pszErrorMsgNET_DVR_GetErrorMsg(errorNo);qCritical()HkCameraMedia::startPreview(), errorNo: errorNo, error msg: pszErrorMsg;}setPlayHandle(playHandlerP);}while(false);qDebug()HkCameraMedia::startPreview() END, retVal: retVal;returnretVal;}4.2 回调函数///////////////////////////////realplay capture ////////////////////////////////////voidCALLBACKfRealDataCallBackOfCapture(__attribute__((unused))LONG lRealHandle,DWORD dwDataType,BYTE*pBuffer,DWORD dwBufSize,void*pUser){DWORD dRet0;switch(dwDataType){caseNET_DVR_SYSHEAD:if(((HkCameraMedia*)pUser)-realPlayPortM0){break;//同一路码流不需要多次调用开流接口}if(!PlayM4_GetPort(((HkCameraMedia*)pUser)-realPlayPortM)){break;}if(!PlayM4_OpenStream(((HkCameraMedia*)pUser)-realPlayPortM,pBuffer,dwBufSize,1024*1024)){dRetPlayM4_GetLastError(((HkCameraMedia*)pUser)-realPlayPortM);qDebug(HkCameraMedia::fRealDataCallBackOfCapture PlayM4_OpenStream return error:%d,dRet);break;}//设置显示回调if(!PlayM4_SetDisplayCallBack(((HkCameraMedia*)pUser)-realPlayPortM,NULL)){dRetPlayM4_GetLastError(((HkCameraMedia*)pUser)-realPlayPortM);qDebug(HkCameraMedia::fRealDataCallBackOfCapture PlayM4_SetDisplayCallBack return error:%d,dRet);break;}//开始解码播放if(!PlayM4_Play(((HkCameraMedia*)pUser)-realPlayPortM,0)){dRetPlayM4_GetLastError(((HkCameraMedia*)pUser)-realPlayPortM);qDebug(HkCameraMedia::fRealDataCallBackOfCapture PlayM4_Play return error:%d,dRet);break;}((HkCameraMedia*)pUser)-isStartDecodingPlaytrue;break;caseNET_DVR_STREAMDATA:PlayM4_InputData(((HkCameraMedia*)pUser)-realPlayPortM,pBuffer,dwBufSize);break;default:break;}return;}5 开始预览采图intHkCameraMedia::realPlayCapture(QString pathP){if(!isPlaying(deviceInfoM.byStartChan)!startPreview(WId(NULL),playHandleM)){returnNET_DVR_ORDER_ERROR;}if(realPlayPortM0||!isStartDecodingPlay){qDebug()HkCameraMedia::realPlayCapture() Not open real play port or not start decoding play!;returnNET_DVR_ORDER_ERROR;}//获取当前视频文件的分辨率BOOL bFlagFALSE;LONG dwWidth0;LONG dwHeight0;bFlagPlayM4_GetPictureSize(realPlayPortM,dwWidth,dwHeight);if(bFlagFALSE){qDebug()HkCameraMedia::realPlayCapture() PlayM4_GetPictureSize error:PlayM4_GetLastError(realPlayPortM);returnNET_DVR_ORDER_ERROR;}DWORD dwSizedwWidth*dwHeight*5;std::unique_ptrBYTE[]capBuf(newBYTE[dwSize]);if(nullptrcapBuf){qDebug()HkCameraMedia::realPlayCapture() New capture buffer fail!;returnNET_DVR_ORDER_ERROR;}DWORD dwCapSize0;bFlagPlayM4_GetJPEG(realPlayPortM,capBuf.get(),dwSize,dwCapSize);if(bFlagFALSE){qDebug()HkCameraMedia::realPlayCapture() PlayM4_GetBMP error:PlayM4_GetLastError(realPlayPortM);returnNET_DVR_ORDER_ERROR;}QFilefile(pathP);if(!file.open(QIODevice::WriteOnly)){qDebug()HkCameraMedia::realPlayCapture() fopen fail!;returnNET_DVR_ORDER_ERROR;}qint64 bytesWrittenfile.write(reinterpret_castconstchar*(capBuf.get()),dwSize);if(bytesWritten-1){qDebug()HkCameraMedia::realPlayCapture() Write picture fail!;returnNET_DVR_ORDER_ERROR;}returnNET_DVR_NOERROR;}boolHkCameraMedia::isPlaying(intiChannlID){Q_UNUSED(iChannlID);returnplayHandleM0;}6 停止预览boolHkCameraMedia::stopPreview(intrPlayHandlerP){boolretValfalse;qDebug()HkCameraMedia::stopPreview() BEGIN;if(realPlayPortM0){qDebug()HkCameraMedia::stopPreview() Not start preview, no need stop.;returntrue;}retValNET_DVR_StopRealPlay(rPlayHandlerP);if(retValfalse){LONG errorNoNET_DVR_NOERROR;char*pszErrorMsgNET_DVR_GetErrorMsg(errorNo);qCritical()HkCameraMedia::stopPreview(), errorNo: errorNo, error msg: pszErrorMsg;}//停止解码if(!PlayM4_Stop(rPlayHandlerP)){qDebug(PlayM4_Stop error:%d,PlayM4_GetLastError(rPlayHandlerP));}if(!PlayM4_CloseStream(rPlayHandlerP)){qDebug(PlayM4_CloseStream error:%d,PlayM4_GetLastError(rPlayHandlerP));}PlayM4_FreePort(rPlayHandlerP);rPlayHandlerP-1;setPlayHandle(rPlayHandlerP);qDebug()HkCameraMedia::stopPreview() END, retVal: retVal;returnretVal;}