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

embedded/2025/2/8 16:58:40/

        我用的时候海康官网在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/embedded/160578.html

相关文章

深度学习01 神经网络

目录 神经网络 ​感知器 感知器的定义 感知器的数学表达 感知器的局限性 多层感知器&#xff08;MLP, Multi-Layer Perceptron&#xff09; 多层感知器的定义 多层感知器的结构 多层感知器的优势 偏置 偏置的作用 偏置的数学表达 神经网络的构造 ​神经网络的基本…

Java面试题及答案整理( 2022最新版,持续更新)

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~ Java面试永远是程序员迈向成功的第一个门槛&#xff0c;想要面试成功&#xff0c;各种面试题的洗礼是必不可少的&#xff0c;下面就来看看小编…

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面&#xff0c;我们可以通过在项目文件夹上点击鼠标右键&#xff0c;选择“New”菜单下的“Python File”来创建一个 Python 文件&#xff0c;在给文件命名时建议使用英文字母和下划线的组合&#xff0c;创建好的 Python 文件会自动打开&#…

dl学习笔记(9):pytorch数据处理的完整流程

1&#xff09;自动导入常用库的设置方式 在开始之前&#xff0c;这里介绍一下自动导入常用的你需要加载的库的操作方式。 首先在我们的目录下找到ipython文件&#xff0c;如下图&#xff1a; 然后找到里面的startup文件&#xff1a; 然后新建一个文本文档&#xff0c;输入你每…

如何挑选最适合您需求的智能氮气柜:七大关键因素沐渥科技详解

挑选智能氮气柜时&#xff0c;您需要考虑以下几个关键因素&#xff0c;以确保选择最适合您需求的设备&#xff1a; 1.湿度控制范围 根据您需要存储的物品对湿度敏感度的要求来确定所需的湿度控制范围。一些高端产品可以将内部湿度降至极低水平&#xff08;如1%RH或更低&#xf…

【文件上传、秒传、分片上传、断点续传、重传】

文章目录 获取文件对象文件上传&#xff08;秒传、分片上传、断点续传、重传&#xff09;优化 获取文件对象 input标签的onchange方法接收到的参数就是用户上传的所有文件 <html lang"en"><head><title>文件上传</title><style>#inp…

OpenCV:图像修复

目录 简述 1. 原理说明 1.1 Navier-Stokes方法&#xff08;INPAINT_NS&#xff09; 1.2 快速行进方法&#xff08;INPAINT_TELEA&#xff09; 2. 实现步骤 2.1 输入图像和掩膜&#xff08;Mask&#xff09; 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …

三格电子-单串口服务器说明

一、产品介绍 1.1 功能简介 SG-TCP232-110 是一款用来进行串口数据和网口数据转换的设备。解决普通 串口设备在 Internet 上的联网问题。 设备的串口部分提供一个 232 接口和一个 485 接口&#xff0c;两个接口内部连接&#xff0c;同 时只能使用一个口工作。 设 备 的网 口…