特别说明:个人笔记,不惜勿喷。

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进行视频预览及云台控制相关推荐

  1. linux qt调用摄像头,Qt5下实现摄像头预览及捕获图像方法实例

    Step4:修改mainwindow.cpp 源码如下 #include "mainwindow.h" #include "ui_mainwindow.h" M ...

  2. 《Sony Vegas Pro 12标准教程》——2.7 视频预览与回放设置

    本节书摘来自异步社区<Sony Vegas Pro 12标准教程>一书中的第2章,第2.7节,作者 糜正磊,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.7 ...

  3. 二、JAVA调用海康威视SDK实现摄像头预览完整版

    接上一章:一.JAVA调用海康威视SDK实现摄像头预览 添加摄像头信息输入框 添加视频控制按钮 添加截图功能 代码: PreView.java package com.kx.hcws;import j ...

  4. WebRTC Native M96 SDK接口封装--startPreview开启视频预览

    今天聊的事儿,跟peer connection一点关系没有,只是开启本地预览. 在没有进行任何网络连接的时候,用户也可以先把本地的摄像头打开,孤芳自赏一下. 如何枚举视频设备,已经介绍过了:https ...

  5. Hikvison对接NVR实现WEB无插件开发包实现前端视频预览(html、vue、nginx代理)

    场景 Vue中预览HIKVSION海康威视的NVR(网络硬盘录像机)中多个通道(摄像机)的视频: Vue中预览HIKVSION海康威视的NVR(网络硬盘录像机)中多个通道(摄像机)的视频_霸道流氓气质 ...

  6. java接口方式调用海康大华摄像机预览。

    客户有海康和大华的监控设备,没有买各类安防平台,国标方式需要预留给其他需要接入的系统,得兼容高版本chrome,询问了大华的客服人员,最后选择了该方案进行解决,记录下曲折的过程.延迟大约10秒的样子, ...

  7. android显示视频预览

    android 11 kotlin显示视频预览 权限 读sd卡中的mp4文件的权限 <uses-permission android:name="android.permission. ...

  8. android surface清空,Android:如何在surfaceDestroyed()之后重启视频预览?

    我通过以下方式创建了一个CapturePreview类和CameraManager类: CapturePreview: public class CaptureView extends Surface ...

  9. 给FlvDownloader加了一个视频预览的功能

    今天晚上给FlvDownloader加了一个视频预览的功能,内嵌了一个Flv播放器,现在可以一边下一边播放了,功能集成后在使用用上比上个版本的预览功能要方便不少,不用两边拷贝地址了. 并且基本功能都比 ...

最新文章

  1. 关于Newtonsoft.Json,LINQ to JSON的一个小demo
  2. 使用Eclipse开发Java Web过程中Debug调试的使用方法
  3. java中的并发类_java中并发常用工具类
  4. 机器学习中的数学(二)--梯度下降法
  5. 3D视频的质量评价报告 (MSU出品)
  6. python list二维数组_python中的二维数组和lamda
  7. Go接口(Interface)的使用方法
  8. 经典人生感悟 看看你少了那一条
  9. 21世纪如何正确思考及开创个人事业(转发)
  10. matlab命令窗口双大于号不显示了 回车命令不管用了,怎么改才能恢复
  11. The server quit without updating PID file
  12. 新一代红米参数模糊的背后 是否有欺诈嫌疑?
  13. 14x1.5cm竖向标签有点难,VFP调用BarTender来打印
  14. 教你如何对产品做AB测试(abtest)
  15. Mysql----修改语句(alter)
  16. 基础技术篇 10 ——物联网常见通信协议与通讯协议梳理【下】- 通信协议
  17. 33学习笔记——描述统计分析3--数据的描述统计量
  18. java连接sftp工具类
  19. 偶数科技为辽宁农信数字化进程添加新动能
  20. 浅描工作环境电脑维护以及性能测试流程

热门文章

  1. 无线风力报警仪 塔吊使用 风速风向仪
  2. 人事管理系统项目(一)
  3. RationalDMIS 7.1 导入IGES/step数模记录DMIS语句
  4. STM32 nokia 5110应用
  5. “第七届北京亦庄创新创业大赛”商业航天总决赛圆满落幕
  6. 支付宝小程序打开淘系域名
  7. 使用DrawerLayout实现QQ5.0侧拉菜单效果
  8. 如何成为一名技术专家
  9. Java多线程B站爬虫与45万条视频数据,mysql批量写入性能对比,附代码
  10. 用于基于 CNT 的射频辐射热计开发研究的 CPX-VF 探针台