海康威视豆干型网络相机QT的Demo

news/2025/2/9 12:45:18/

        我用的时候海康官网在arm-linux相关SDK没有给DEMO,只在手册里给了参考代码。自己参考SDK提供的手册作了个QT的DEMO版本。

//main.c
#include <QApplication>
#include <QWidget>
#include <QDebug>
#include <QTimer>
#include "HikvisionCamera.h"int main(int argc, char *argv[])
{QApplication app(argc, argv); // 初始化 Qt 应用程序// 创建一个窗口QWidget window;window.setWindowTitle("Video Preview"); // 设置窗口标题window.resize(800, 600); // 设置窗口大小window.show(); // 显示窗口// 创建海康威视相机对象HikvisionCamera camera(&window);// 注册设备并登录if (!camera.login("192.168.1.224", 8000, "admin", "hbst1888")){qDebug() << "Login failed";return -1;}WId Wid = window.winId();//获取窗口句柄// 启动预览if (!camera.startPreview(1,Wid)) // 通道号为 1{qDebug() << "Start preview failed";return -1;}// 设置定时器,10 秒后停止预览并退出QTimer::singleShot(100000, [&]() {camera.stopPreview();camera.logout();app.quit(); // 退出应用程序});return app.exec(); // 启动 Qt 事件循环
}
//HikvisionCamera.cpp
#include "HikvisionCamera.h"
#include <QDebug>
#include <QTimer>
#include <QDateTime>
#include "HCNetSDK.h"
#include "LinuxPlayM4.h"// 实时数据回调函数
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle,       // 实时视频流的句柄,标识当前的视频流会话DWORD dwDataType,       // 数据类型,例如视频流数据、音频流数据等BYTE *pBuffer,          // 指向数据缓冲区的指针,存储实际的数据DWORD dwBufSize,        // 数据缓冲区的大小,单位为字节void* dwUser            // 用户自定义数据指针,通常用于传递上下文信息
)
{VideoPlayer *player = static_cast<VideoPlayer*>(dwUser); // 获取 VideoPlayer 对象if (dwDataType == NET_DVR_STREAMDATA && dwBufSize > 0) // 检查数据类型和大小{QByteArray frame(reinterpret_cast<char*>(pBuffer), dwBufSize); // 将数据转换为 QByteArrayemit player->updateVideoFrame(frame); // 发出信号,传递视频帧数据}
}// 异常回调函数
void CALLBACK g_ExceptionCallBack(DWORD dwType,           // 异常类型,例如网络异常、重连事件等LONG lUserID,           // 用户ID,标识当前的用户会话LONG lHandle,           // 相关的句柄,例如登录句柄或实时视频流句柄void *pUser             // 用户自定义数据指针,通常用于传递上下文信息
)
{switch (dwType) // 根据异常类型处理{case EXCEPTION_RECONNECT: // 重连事件qDebug() << "Reconnect at" << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");break;default:break;}
}HikvisionCamera::HikvisionCamera(QWidget *parent): lUserID(-1), lRealPlayHandle(-1), lPort(-1), player(new VideoPlayer(parent))
{// 初始化海康威视 SDKNET_DVR_Init();NET_DVR_SetConnectTime(2000, 1); // 设置连接超时时间NET_DVR_SetReconnect(10000, true); // 设置自动重连时间NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL); // 设置异常回调
}HikvisionCamera::~HikvisionCamera()
{NET_DVR_Cleanup(); // 清理 SDK 资源delete player;
}bool HikvisionCamera::login(const char *ip, int port, const char *username, const char *password)
{memset(&struLoginInfo, 0, sizeof(struLoginInfo));strcpy(struLoginInfo.sDeviceAddress, ip); // 设备 IP 地址struLoginInfo.wPort = port; // 设备端口strcpy(struLoginInfo.sUserName, username); // 用户名strcpy(struLoginInfo.sPassword, password); // 密码lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); // 登录设备if (lUserID < 0) // 登录失败{qDebug() << "Login failed, error code:" << NET_DVR_GetLastError();return false;}return true;
}void HikvisionCamera::logout()
{if (lUserID != -1){NET_DVR_Logout(lUserID); // 注销用户lUserID = -1;}
}bool HikvisionCamera::startPreview(int channel,WId Wid)
{memset(&struPlayInfo, 0, sizeof(struPlayInfo));struPlayInfo.hPlayWnd = Wid; // 设置预览窗口句柄struPlayInfo.lChannel = channel; // 通道号struPlayInfo.dwStreamType = 0; // 流类型struPlayInfo.dwLinkMode = 0; // 链接模式struPlayInfo.bBlocked = 1; // 阻塞模式lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, player); // 启动预览if (lRealPlayHandle < 0) // 预览失败{qDebug() << "NET_DVR_RealPlay_V40 error, error code:" << NET_DVR_GetLastError();return false;}return true;
}void HikvisionCamera::stopPreview()
{if (lRealPlayHandle != -1){NET_DVR_StopRealPlay(lRealPlayHandle); // 停止预览lRealPlayHandle = -1;}if (lPort != -1) // 释放播放库资源{PlayM4_Stop(lPort);PlayM4_CloseStream(lPort);PlayM4_FreePort(lPort);lPort = -1;}
}

        针对部分重点代码梳理一下逻辑,

        登陆比较好说,就是设备IP地址、端口号、通过海康的设备检索软件设置的用户名、密码。

bool HikvisionCamera::login(const char *ip,         // 设备的 IP 地址int port,               // 设备的端口号const char *username,   // 登录设备的用户名const char *password    // 登录设备的密码
)
{memset(&struLoginInfo, 0, sizeof(struLoginInfo)); // 清空登录信息结构体strcpy(struLoginInfo.sDeviceAddress, ip); // 设置设备 IP 地址struLoginInfo.wPort = port; // 设置设备端口strcpy(struLoginInfo.sUserName, username); // 设置用户名strcpy(struLoginInfo.sPassword, password); // 设置密码lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); // 登录设备if (lUserID < 0) // 登录失败{qDebug() << "Login failed, error code:" << NET_DVR_GetLastError();return false;}return true;
}

        登出的时候直接用登陆时获取到的用户ID进行登出。

void HikvisionCamera::logout()
{if (lUserID != -1){NET_DVR_Logout(lUserID); // 注销用户lUserID = -1;}
}

        开始预览,

        窗口句柄用于指定在哪个窗口显示视频流。

        设备通道号用于指定从哪个通道获取视频流。通道号通常从1开始,有多少通道取决于设备的配置。

        视频流类型,通常有 0主码流、1子码流

        主码流是主视频流,分辨率较高。

        子码流是辅助视频流,分辨率较低,适合网络传输。

        链接模式有0 TCP模式和1 UDP模式

        阻塞模式,0关闭,1开启。实时预览是否阻塞当前线程。

bool HikvisionCamera::startPreview(int channel,WId Wid)
{memset(&struPlayInfo, 0, sizeof(struPlayInfo));struPlayInfo.hPlayWnd = Wid; // 设置预览窗口句柄struPlayInfo.lChannel = channel; // 通道号struPlayInfo.dwStreamType = 0; // 流类型struPlayInfo.dwLinkMode = 0; // 链接模式struPlayInfo.bBlocked = 1; // 阻塞模式lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, player); // 启动预览if (lRealPlayHandle < 0) // 预览失败{qDebug() << "NET_DVR_RealPlay_V40 error, error code:" << NET_DVR_GetLastError();return false;}return true;
}


http://www.ppmy.cn/news/1570578.html

相关文章

部署Hadoop高可用集群

注&#xff1a;下述步骤仅供参考&#xff0c;具体指令和操作截图的word版本可见上方本博文免费资源绑定。 1.为虚拟机Hadoop1&#xff0c;2&#xff0c;3拍摄快照以免后续错误操作 2.创建hadoop-HA目录区分之前的集群并将Hadoop安装到该目录下 3.进入/etc目录修改系统环境变量…

深度剖析 Redisson 分布式锁:原理、实现与应用实践

文章目录 写在文章开头详解Redisson 分布式锁使用和实现前置准备工作分布式锁的基本使用公平锁的使用联锁的使用读写锁基本使用常见问题Redisson和Jedis有什么区别redisson如何实现分布式锁redisson如何实现分布式锁的可重入redisson如何实现公平锁Redisson的watchdog机制是什么…

Elasticsearch 高级技巧

Elasticsearch 高级技巧 1. 优化查询 使用过滤器&#xff08;Filter&#xff09;而不是查询&#xff08;Query&#xff09; Elasticsearch 中的查询分为两种主要类型&#xff1a;查询&#xff08;Query&#xff09; 和 过滤器&#xff08;Filter&#xff09;。查询会计算文档…

【深度学习入门_机器学习理论】决策树(Decision Tree)

本部分主要为机器学习理论入门_决策树算法&#xff0c;书籍参考 “ 统计学习方法&#xff08;第二版&#xff09;”。 学习目标&#xff1a; 熟悉决策树基础知识&#xff1a;树、熵、信息增益、基尼指数&#xff1b;熟悉决策树构建步骤&#xff1b;熟悉3种典型决策树算法&…

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例&#xff1a;金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…

Nginx 配置 SSL(HTTPS)详解

Nginx作为一款高性能的HTTP和反向代理服务器&#xff0c;自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL&#xff0c;实现HTTPS的访问。 随着互联网安全性的日益重要&#xff0c;HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…

【单层神经网络】基于MXNet库简化实现线性回归

写在前面 同最开始的两篇文章 完整程序及注释 导入使用的库# 基本 from mxnet import autograd, nd, gluon # 模型、网络 from mxnet.gluon import nn from mxnet import init # 学习 from mxnet.gluon import loss as gloss # 数据集 from mxnet.gluon…

服务器重启后报Predis_ServerException: Client sent AUTH, but no password is set

Redis问题产生后,处理办法 2025/02/08 11:21:43 [error] [exception.Predis_ServerException] Predis_ServerException: Client sent AUTH, but no password is set in /www/wwwroot/er/protected/extensions/redis/Predis.php:573 Stack trace: #0 /www/wwwroot/er/protected…