1 海康相机linux预览采图
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;}

相关新闻

SpringDataRedis 操作 redis

SpringDataRedis 操作 redis

Spring Data Redis 完全按照 Redis 的数据类型做了模块化封装,和原生命令一一对应。 下面我按「通用Key操作 5大核心数据类型」分类整理,每个方法都标注等价的 Redis 原生命令和可直接运行的代码示例,方便你对照记忆。一、通用 Key 操作&…

2026/11/13 17:53:23 阅读更多 →
深耕数智基建 赋能 AI 落地|光环新网荣获 AI 数字基础设施最佳实践

深耕数智基建 赋能 AI 落地|光环新网荣获 AI 数字基础设施最佳实践

2026 年 8 月 22 日,第五届中国数据 AI 价值峰会于北京成功举办。会议以“数据驱动AI”为主题,聚焦数据要素价值释放与 AI 工程化落地,并于同期举行了数据 AI创新标杆案例颁奖活动。光环新网凭借在数字基础设施领域的持续深耕建设与AI数智落地…

2026/11/6 9:09:55 阅读更多 →
计算机毕设选题:融合 AI 分析与文化图谱的非遗平台功能设计

计算机毕设选题:融合 AI 分析与文化图谱的非遗平台功能设计

一、AI 与非遗文化平台的结合 传统文化网站通常以文章和图片展示为主,内容之间缺少关联,用户也很难快速理解项目的历史演变与文化价值。“承遗”平台增加 AI 项目分析、个性化推荐、文化图谱和智能问答,让用户能够从时间、技艺、地域、人物及…

2026/10/27 19:50:26 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻