Qt 调用海康威视的SDK进行视频预览及云台控制
特别说明:个人笔记,不惜勿喷。
Qt获取海康摄像头图像方法很多,比如可以只用RTSP的方式直接拉流获取。但是RTSP拉流的方式我也尝试过,需要用到FFMPEG,由于这个库东西比较多,而且里面很多流程需要自己去做解析,程序员本就是图方便和高效,与其去折腾,还不如直接用官方提供的SDK。这样省很多事情。
海康SDK开发心得:在预览图像的时候图像时延是非常低的,相比ffmpeg的rtsp要低很多,因此如果项目对于时延要去高的地方可以考虑用sdk来试试。
于是乎,自己研究了下,发现比较简单,此处仅作笔记,无技术含量。
1、首先工程文件添加海康SDK的库和头文件
LIBS += -L$$PWD/hiklib/lib/ -lHCNetSDK
INCLUDEPATH += $$PWD/hiklib/include
DEPENDPATH += $$PWD/hiklib/include
2、登录摄像头
NET_DVR_Init();NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);NET_DVR_USER_LOGIN_INFO struLoginInfo;NET_DVR_DEVICEINFO_V40 struDeviceInfoV40;memset(&struLoginInfo, 0x00, sizeof(NET_DVR_USER_LOGIN_INFO));memset(&struDeviceInfoV40, 0x00, sizeof(NET_DVR_DEVICEINFO_V40));struLoginInfo.bUseAsynLogin = 0; // 同步登录方式strcpy(struLoginInfo.sDeviceAddress, "192.168.0.143"); // 设备IP地址struLoginInfo.wPort = 8000 ; // 设备服务端口strcpy_s(struLoginInfo.sUserName, "admin"); // 设备登录用户名strcpy_s(struLoginInfo.sPassword, "123456"); // 设备登录密码m_userId = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);if (m_userId < 0){qDebug() << "登录失败" << m_userId << NET_DVR_GetErrorMsg();}
3、登录成功后就可以直接启动图像预览了。
NET_DVR_PREVIEWINFO struPreviewInfo;memset(&struPreviewInfo, 0x00, sizeof(NET_DVR_PREVIEWINFO));struPreviewInfo.lChannel = 1; // 通道idstruPreviewInfo.hPlayWnd = (HWND)ui->labelPreview->winId();struPreviewInfo.dwStreamType = 0; // 码流类型: 0-主码流struPreviewInfo.dwLinkMode = 0; // 链接方式: 0- TCP方式struPreviewInfo.bBlocked = 0; // 0 - 非阻塞取流,1 - 阻塞取流m_previewHandle = NET_DVR_RealPlay_V40(m_userId, &struPreviewInfo, NULL, NULL);
4、云台控制
#define START 0
#define STOP 1NET_DVR_PTZControl(m_previewHandle, TILT_UP, START);NET_DVR_PTZControl(m_previewHandle, TILT_UP, STOP);/* 下 */NET_DVR_PTZControl(m_previewHandle, TILT_DOWN, START);NET_DVR_PTZControl(m_previewHandle, TILT_DOWN, STOP);/* 其他方向可以自行查看头文件,方法一样 */
5、辅助功能:网络摄像头局域网扫描通信协议,方便在不知道摄像头ip的情况下进行
通过UDP报文广播的方式扫描在线摄像头
QString strData = QString("<?xml version=\"1.0\" encoding=\"utf-8\"?><Probe><Uuid>");m_strUuid = QUuid::createUuid().toString(QUuid::WithoutBraces).toUpper();strData += m_strUuid;strData += "</Uuid><Types>inquiry</Types></Probe>";qint64 len = m_udpSocket->writeDatagram(strData.toLatin1(), QHostAddress("239.255.255.250"), 37020);qDebug() << "==>" << len << strData;
协议解析:
void ScanIPCameras::sltUdpSocketRead()
{QByteArray byData;// qDebug() << "udp recv" << m_udpSocket->pendingDatagramSize();while (m_udpSocket->hasPendingDatagrams()) {
#if (QT_VERSION > QT_VERSION_CHECK(5, 8, 0))QNetworkDatagram datagram = m_udpSocket->receiveDatagram();QHostAddress host = datagram.senderAddress();byData += datagram.data();
#elseQByteArray datagram;datagram.resize(m_udpSocket->pendingDatagramSize());m_udpSocket->readDatagram(datagram.data(), datagram.size());byData += datagram;
#endif}parseXmlData(byData);
}
解析如下:
void ScanIPCameras::parseXmlData(const QByteArray &_byContent)
{QDomDocument document;QString error;int row = 0, column = 0;if (!document.setContent(_byContent, false, &error, &row, &column)){return;}if (document.isNull()){return;}QDomElement root = document.documentElement();for(QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling()){QDomElement e = node.toElement();QString tag = node.nodeName();QString value = e.text();if ("Uuid" == tag) {qDebug() << "value" << value;qDebug() << "Uuid " << m_strUuid;m_strUuid = value;}else if ("DeviceDescription" == tag) {}else if ("IPv4Address" == tag) {emit signalCamera(value);emit signalNotify(QString("摄像头扫描: 扫描完成,发现设备[%1]!~").arg(value));}else if ("CommandPort" == tag) {}else if ("HttpPort" == tag) {}else if ("DHCP" == tag) {}else if ("DeviceSN" == tag) {}else {qDebug() << tag << value;}}
}
效果图:
Qt 调用海康威视的SDK进行视频预览及云台控制相关推荐
- linux qt调用摄像头,Qt5下实现摄像头预览及捕获图像方法实例
Step4:修改mainwindow.cpp 源码如下 #include "mainwindow.h" #include "ui_mainwindow.h" M ...
- 《Sony Vegas Pro 12标准教程》——2.7 视频预览与回放设置
本节书摘来自异步社区<Sony Vegas Pro 12标准教程>一书中的第2章,第2.7节,作者 糜正磊,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.7 ...
- 二、JAVA调用海康威视SDK实现摄像头预览完整版
接上一章:一.JAVA调用海康威视SDK实现摄像头预览 添加摄像头信息输入框 添加视频控制按钮 添加截图功能 代码: PreView.java package com.kx.hcws;import j ...
- WebRTC Native M96 SDK接口封装--startPreview开启视频预览
今天聊的事儿,跟peer connection一点关系没有,只是开启本地预览. 在没有进行任何网络连接的时候,用户也可以先把本地的摄像头打开,孤芳自赏一下. 如何枚举视频设备,已经介绍过了:https ...
- Hikvison对接NVR实现WEB无插件开发包实现前端视频预览(html、vue、nginx代理)
场景 Vue中预览HIKVSION海康威视的NVR(网络硬盘录像机)中多个通道(摄像机)的视频: Vue中预览HIKVSION海康威视的NVR(网络硬盘录像机)中多个通道(摄像机)的视频_霸道流氓气质 ...
- java接口方式调用海康大华摄像机预览。
客户有海康和大华的监控设备,没有买各类安防平台,国标方式需要预留给其他需要接入的系统,得兼容高版本chrome,询问了大华的客服人员,最后选择了该方案进行解决,记录下曲折的过程.延迟大约10秒的样子, ...
- android显示视频预览
android 11 kotlin显示视频预览 权限 读sd卡中的mp4文件的权限 <uses-permission android:name="android.permission. ...
- android surface清空,Android:如何在surfaceDestroyed()之后重启视频预览?
我通过以下方式创建了一个CapturePreview类和CameraManager类: CapturePreview: public class CaptureView extends Surface ...
- 给FlvDownloader加了一个视频预览的功能
今天晚上给FlvDownloader加了一个视频预览的功能,内嵌了一个Flv播放器,现在可以一边下一边播放了,功能集成后在使用用上比上个版本的预览功能要方便不少,不用两边拷贝地址了. 并且基本功能都比 ...
最新文章
- 关于Newtonsoft.Json,LINQ to JSON的一个小demo
- 使用Eclipse开发Java Web过程中Debug调试的使用方法
- java中的并发类_java中并发常用工具类
- 机器学习中的数学(二)--梯度下降法
- 3D视频的质量评价报告 (MSU出品)
- python list二维数组_python中的二维数组和lamda
- Go接口(Interface)的使用方法
- 经典人生感悟 看看你少了那一条
- 21世纪如何正确思考及开创个人事业(转发)
- matlab命令窗口双大于号不显示了 回车命令不管用了,怎么改才能恢复
- The server quit without updating PID file
- 新一代红米参数模糊的背后 是否有欺诈嫌疑?
- 14x1.5cm竖向标签有点难,VFP调用BarTender来打印
- 教你如何对产品做AB测试(abtest)
- Mysql----修改语句(alter)
- 基础技术篇 10 ——物联网常见通信协议与通讯协议梳理【下】- 通信协议
- 33学习笔记——描述统计分析3--数据的描述统计量
- java连接sftp工具类
- 偶数科技为辽宁农信数字化进程添加新动能
- 浅描工作环境电脑维护以及性能测试流程