1 海康相机linux预览采图

发布时间:2026/11/4 18:32:29

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;}
延伸阅读

更多相关文章

2026/11/4 18:32:12

SpringDataRedis 操作 redis

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

2026/10/28 15:33:26

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

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

2026/10/28 18:28:11

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

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

2026/11/4 18:28:35

AgentScope 2.0:面向生产级多智能体协同的Java运行时基础设施

1. 这不是又一个“AI Agent框架”——AgentScope到底在解决什么真问题?最近在几个技术群和内部分享会上,总有人甩出一句:“推荐一个牛逼的AgentScope系统”,然后就没了下文。我一开始也以为是另一个披着Agent外衣、实则跑个LangCh…

2026/11/4 18:28:35

AutoCAD二次开发:ObjectARX与Visual Studio版本对应指南

1. ObjectARX与Visual Studio版本对应关系详解在AutoCAD二次开发领域,ObjectARX作为官方提供的开发框架,其版本与Visual Studio的兼容性一直是开发者必须面对的首要问题。作为一名从事AutoCAD插件开发多年的工程师,我深知选错开发环境会导致的…

2026/11/4 18:28:35

Zotero集成DeepL免费API实现学术文献自动翻译

1. 项目概述:为什么Zotero配DeepL不是“锦上添花”,而是文献处理的刚需闭环Zotero免费配置DeepL API密钥——这短短十一个字,背后站着的是每天被英文文献压得喘不过气的科研新手、赶DDL的硕博生、需要快速消化外文资料的行业研究员&#xff0…

2026/11/4 18:28:35

佳能IR1133 U盘打印功能开启全指南

1. 项目概述:为什么佳能IR1133的U盘打印功能像“被锁住的抽屉”? 你把U盘插进佳能IR1133复印机侧面那个标着USB图标的接口,屏幕亮了,显示“USB设备已连接”,可一按“扫描”或“打印”按钮,菜单里压根找不到…

2026/11/4 18:28:35

数据库约束详解:确保数据完整性的关键机制

1. 数据库约束:数据完整性的守护者 在数据库设计和管理中,约束(Constraints)就像交通规则对于城市道路系统一样重要。它们定义了数据必须遵守的规则,确保数据库中的数据始终保持准确、一致和可靠。想象一下&#xff0c…

2026/11/4 18:23:34

Jev技术解析:JSON Schema验证中间件原理与工程实践

我无法根据当前输入生成符合要求的博文。原因如下:项目正文为空:输入中项目正文: "",即没有任何实质性描述。而我的核心任务是“基于项目标题、项目正文、关键词和摘要描述”进行深度拆解与延展。没有正文,就失去了理解…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑