发布时间:2026/9/3 7:37:33
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/9/3 7:37:33

SpringDataRedis 操作 redis

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

2026/9/3 7:37:33

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

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

2026/9/3 7:37:33

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

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

2026/9/3 7:47:34

牛顿-拉夫逊法潮流计算:从原理到MATLAB实现与工程实践

简介:本资源是一套面向电力系统专业本科生、研究生及工程技术人员的潮流计算实践工具,基于极坐标系下的牛顿-拉夫逊法,用MATLAB实现高精度、可扩展的稳态潮流求解。资源包共3个文件(2个Excel表格1个主程序M文件)&#…

2026/9/3 7:47:34

游戏任务链设计:从四级到五级的P8开荒流程全解析

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

2026/9/3 7:47:34

人生代码 | 第9关:任务并发 —— 调度混乱,努力白赶

|第二篇处理篇|核心命题:资源调度|LCN : 0000-1001 摘要 第8关我们学会了落地执行,但人生是多任务系统,工作、家庭、成长争抢有限的精力CPU。很多人不是时间不够,而是调度策略出错。第9关借助…

2026/9/3 7:47:34

03Numpy基础(中)

数组的创建1.创建指定数组适用于:已知数组内元素具体数值import numpy as nparrnp.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr)#([a,b,c]) shape(3,3)2.创建递增数组np.arange()numpy.arange([start, ]stop, [step, ]dtypeNone, *, deviceNone, likeNone) #前两…

2026/9/3 7:47:34

AI 推理优化实践:vLLM Continuous Batching:5800 t/s 吞吐量的核心引擎

一、为什么需要 Continuous Batching 1.1 三种 Batching 策略对比 ① 静态批处理 (Static Batching) — 传统方式 ┌──────────────────────────────────────────────┐ │ Req A: [Prefill][D][D][D][D][D][D][D][D][D][D] │…

2026/9/3 7:42:33

电力设备红外图像数据集构建与YOLOv8目标检测实战指南

简介:本资源是面向电力智能化检测领域的专业红外图像数据集,专为计算机视觉方向的算法工程师、电力AI应用研究者及高校科研团队设计,用于训练与验证电力设备部件的目标检测模型。数据集包含3930张高质量红外图像,覆盖避雷器、断路…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…