一、前言

云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂家使用自家SDK控制云台,但是大部分都会选择onvif来控制,毕竟是国际标准的通用的,只要符合这个标准的都可以使用,onvif协议的解析通常用的开源库是soap,涵盖的内容比较全,包括获取各种设备信息和回控等,缺点就是比较臃肿,使用非常不容易,函数名实在是有点不顺手,很多新手都绕在其中不知所措最后放弃,其实onvif官方提供的就是soap,可能要照顾到所有的onvif标准吧,内容特别多,我看过其中的部分源码,底层机制和我最终自创的解析机制完全一致,为此特意将纯Qt网络通信封装了一个onvif通信类做成的pri模块,大致的处理流程如下:

onvif处理流程

  1. 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备。
  2. 接收到的xml格式的数据解析,得到设备的Onvif地址。
  3. 对Onvif地址发送对应的数据,收到数据取出对应的节点数据。
  4. 请求Onvif地址获取Media地址和Ptz地址,Media地址用来获取详细的配置文件,Ptz地址用来云台控制。
  5. ptz控制是对Ptz地址发送对应的数据即可。
  6. 设置了用户认证的需要组织用户token信息一块发送,每次都需要作鉴权处理。
  7. 接收到的数据不是标准的xml数据,没法按照正常的节点解析来处理,只能用QXmlQuery来做。
  8. 每个厂家设备返回的数据未必完全一致,基本上都不一致,需要进行模糊查找节点值。
  9. 特意采用底层协议解析,因为soap太臃肿函数名称太另类,特意做的轻量级的。
  10. 两个必备工具,Onvif Device Manager 和 Onvif Device Test Tool。

ptz云台说明

  1. x、y、z 范围都在0-1之间。
  2. x为负数,表示左转,x为正数,表示右转。
  3. y为负数,表示下转,y为正数,表示上转。
  4. z为正数,表示拉近,z为负数,表示拉远。
  5. 通过x和y的组合,来实现云台的控制。
  6. 通过z的组合,来实现焦距控制。

onvif功能模块特点

  1. 广播搜索设备,支持IPC和NVR,依次返回,可选择不同的网卡IP。
  2. 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。
  3. 可对指定的Profile获取视频流Rtsp地址,比如主码流子码流地址。
  4. 可对每个设备设置Onvif用户信息,用于认证获取详细信息。
  5. 可实时预览摄像机图像。
  6. 支持云台控制,可上下左右调节云台,支持绝对移动和相对移动,可放到和缩小图像远近。
  7. 支持Qt4和Qt5任意Qt版本,亲测Qt4.7.0到Qt5.12.4。
  8. 支持任意编译器,亲测mingw、msvc、gcc、clang。
  9. 支持任意操作系统,亲测xp、win7、win10、linux、嵌入式linux、树莓派全志H3等。
  10. 支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、华为、海思芯片内核等,可定制开发。
  11. 支持对指定IP地址进行单播搜索,比如跨网段情况下非常有用。
  12. 纯Qt编写,超级小巧轻量,总共约2000行代码,不依赖任何第三方的库和组件,跨平台。
  13. 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理比如修改IP等。
  14. 工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。
  15. 支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。

二、功能特点

软件模块

  1. 视频监控模块,各种停靠小窗体子模块,包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。
  2. 视频回放模块,包括本地回放、远程回放、设备播放、图片回放、视频上传等。
  3. 电子地图模块,包括图片地图、在线地图、离线地图、路径规划等。
  4. 日志查询模块,包括本地日志、设备日志等。
  5. 系统设置模块,包括系统设置(基本设置、视频参数、数据库设置、地图配置、串口配置等)、录像机管理、摄像机管理、轮询配置、用户管理等。

基础功能

  1. 支持各种视频流(rtsp、rtmp、http等)、视频文件(mp4、rmvb、avi等)、本地USB摄像机播放。
  2. 支持多画面切换,包括1、4、6、8、9、13、16、25、36、64画面切换。
  3. 支持全屏切换,多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键(alt+enter全屏,esc退出全屏)。
  4. 支持视频轮询,包括1、4、9、16画面轮询,可设置轮询分组(轮询预案)、轮询间隔、码流类型等。
  5. 支持onvif协议,包括设备搜索、云台控制、设备控制(图片参数、校对时间、系统重启,抓拍图片等)。
  6. 支持权限管理,不同的用户可以对应不同的模块权限,比如删除日志、关闭系统等。
  7. 数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。
  8. 本地USB摄像机支持设置分辨率、帧率等参数。
  9. 所有停靠模块都自动生成对应的菜单用来控制显示和隐藏,在标题栏右键可以弹出。
  10. 支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。
  11. 双击设备弹出实时预览视频,支持图片地图、在线地图、离线地图等。
  12. 摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。
  13. 删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。
  14. 图片地图上设备按钮可自由拖动,自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息,用来更新设备位置。
  15. 视频监控面板窗体中任意通道支持拖曳交换,瞬间响应。
  16. 封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。
  17. 双击节点、拖曳节点、拖曳窗体交换位置等操作,均自动更新保存最后的播放地址,下次软件打开自动应用。
  18. 右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。
  19. 支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮。
  20. 支持超时自动隐藏鼠标指针、自动全屏机制。
  21. 支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。
  22. 支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
  23. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
  24. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
  25. 可设置软件中文名称、英文名称、LOGO图标等。
  26. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。

特色功能

  1. 主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。
  2. 停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。
  3. 双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。
  4. 原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。
  5. 原创数据导入导出机制,跨平台不依赖任何组件,瞬间导出数据。
  6. 内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。
  7. 自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。
  8. 精美换肤,高达17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
  9. 视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。
  10. 双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。
  11. 录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
  12. 可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。
  13. 支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。
  14. 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
  15. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控、检察院审判监控等。
  16. 支持xp、win7、win10、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
  17. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

三、体验地址

  1. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun
  4. 个人主页:https://blog.csdn.net/feiyangqingyun
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

四、效果图

五、核心代码

OnvifDevice *frmVideoMain::getCurrentDevice()
{OnvifDevice *onvifDevice = 0;//判断当前url,找出该url对应的ptz地址if (!App::CurrentUrl.isEmpty()) {//可能是主码流也可能是子码流int index1 = DBData::IpcInfo_RtspMain.indexOf(App::CurrentUrl);int index2 = DBData::IpcInfo_RtspSub.indexOf(App::CurrentUrl);int index = -1;if (index1 >= 0) {index = index1;} else if (index2 >= 0) {index = index2;}if (index >= 0) {QString userName = DBData::IpcInfo_UserName.at(index);QString userPwd = DBData::IpcInfo_UserPwd.at(index);QString onvifAddr = DBData::IpcInfo_OnvifAddr.at(index);QString mediaAddr = DBData::IpcInfo_MediaAddr.at(index);QString ptzAddr = DBData::IpcInfo_PtzAddr.at(index);bool exist = false;foreach (OnvifDevice *device, devices) {if (device->getDeviceUrl() == onvifAddr) {exist = true;onvifDevice = device;break;;}}if (!exist) {onvifDevice = new OnvifDevice(this);}onvifDevice->setUser(userName, userPwd);onvifDevice->setDeviceUrl(onvifAddr);onvifDevice->setMediaUrl(mediaAddr);onvifDevice->setPtzUrl(ptzAddr);if (!exist) {devices << onvifDevice;}}}return onvifDevice;
}void frmVideoMain::moveRelative(double x, double y, double z)
{OnvifDevice *device = getCurrentDevice();if (device != 0) {QString profileToken = device->getProfile();device->moveRelative(profileToken, x, y, z);qDebug() << "相对移动" << App::CurrentUrl << profileToken;}
}void frmVideoMain::moveAbsolute(double x, double y, double z)
{OnvifDevice *device = getCurrentDevice();if (device != 0) {QString profileToken = device->getProfile();device->moveAbsolute(profileToken, x, y, z);qDebug() << "绝对移动" << App::CurrentUrl << profileToken;}
}void frmVideoMain::mousePressed(int position)
{QString str;if (position == 0) {str = "底部";} else if (position == 1) {str = "左下角";} else if (position == 2) {str = "左侧";} else if (position == 3) {str = "左上角";} else if (position == 4) {str = "顶部";} else if (position == 5) {str = "右上角";} else if (position == 6) {str = "右侧";} else if (position == 7) {str = "右下角";} else if (position == 8) {str = "中间";}DeviceHelper::addMsg(QString("按下云台 %1").arg(str));
}void frmVideoMain::mouseReleased(int position)
{QString str;if (position == 0) {str = "底部";} else if (position == 1) {str = "左下角";} else if (position == 2) {str = "左侧";} else if (position == 3) {str = "左上角";} else if (position == 4) {str = "顶部";} else if (position == 5) {str = "右上角";} else if (position == 6) {str = "右侧";} else if (position == 7) {str = "右下角";} else if (position == 8) {str = "中间";}DeviceHelper::addMsg(QString("松开云台 %1").arg(str));mousePtz(position);
}void frmVideoMain::mousePtz(int position)
{//根据按下的不同部位发送云台控制命令//1. x、y、z 范围都在0-1之间。//2. x为负数,表示左转,x为正数,表示右转。//3. y为负数,表示下转,y为正数,表示上转。//4. z为正数,表示拉近,z为负数,表示拉远。//5. 通过x和y的组合,来实现云台的控制。//6. 通过z的组合,来实现焦距控制。//计算速度,转为小数double speed = (double)ui->sliderPtzSpeed->value() / 10;if (position == 0) {moveRelative(0.0, -speed, 0.0);} else if (position == 1) {moveRelative(-speed, -speed, 0.0);} else if (position == 2) {moveRelative(-speed, 0.0, 0.0);} else if (position == 3) {moveRelative(-speed, speed, 0.0);} else if (position == 4) {moveRelative(0.0, speed, 0.0);} else if (position == 5) {moveRelative(speed, speed, 0.0);} else if (position == 6) {moveRelative(speed, 0.0, 0.0);} else if (position == 7) {moveRelative(speed, -speed, 0.0);} else if (position == 8) {moveAbsolute(0.0, 0.0, 0.0);}
}

Qt编写安防视频监控系统18-云台控制相关推荐

  1. Qt编写安防视频监控系统33-onvif云台控制

    一.前言 云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一 ...

  2. Qt编写安防视频监控系统26-硬件加速

    一.前言 硬件加速这个功能在一年多以前就已经具备,当时对两个内核一个是ffmpeg内核.一个是vlc内核都做了对应的接口函数,只是当时为了简单没有在系统设置中做出接口,vlc做硬件加速不用自己写代码实 ...

  3. Qt编写安防视频监控系统(支持win/linux/mac/海康/大华/宇视/264/265等)

    一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...

  4. Qt编写安防视频监控系统(界面很漂亮)

    一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...

  5. Qt编写安防视频监控系统57-子模块1设备列表

    一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...

  6. Qt编写安防视频监控系统4-删除视频

    一.前言 一般会有两种处理方式来删除视频,一种是鼠标右键菜单,删除当前视频或者删除所有视频,一种是直接按住当前视频,移到视频通道界面以外就表示删除当前视频,这也是个比较人性化的设置,每个人的喜好不一样 ...

  7. Qt编写安防视频监控系统55-布局方案

    一.前言 这是近期对视频监控系统做得最大的改动,采用了QMainWindow停靠窗体悬停窗体,极大的增强了拓展性,主界面中的各种小模块全部采用了悬停模块,最后不同的工作模式.不同的运行状态(全屏状态. ...

  8. Qt编写安防视频监控系统1-通道切换

    一.前言 通道切换在视频监控系统中是最基础的必备功能,一般都会提供1通道+4通道+6通道+8通道+9通道+16通道这几个通道切换,可能做得比较好的还会提供24通道+32通道的,这个可能对电脑的配置就有 ...

  9. Qt编写安防视频监控系统67-跨平台及国产系统

    一.前言 得益于Qt的超强跨平台特性,本系统也是跨平台的,亲测的系统包括windows全系列.ubuntu全系列.centeos.国产系统UOS.国产系统银河麒麟.中标麒麟.嵌入式linux.树莓派. ...

最新文章

  1. python用渐变色画圆_利用python控制Autocad:pyautocad方式
  2. 算法---给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合
  3. 源哥每日一题第十三弹 百练4124:海贼王之伟大航路 状压dp
  4. 【POJ - 3169】 Layout(差分约束+spfa)(当板子记?)
  5. SpringCloud工作笔记063---Java 手机验证码生成_存储到redis
  6. Android通过命令连接wifi(解决usb不能用+无屏幕情况)
  7. UIButton常用属性
  8. MiniProfiler.EF6监控调试MVC5和EF6的性能
  9. PHP curl传输文件的版本兼容性
  10. ZStack的VPC特性详解及实战
  11. 【资料目录收藏】.NET开发必看资料53个 经典源码77个
  12. CSND帐号居然又能用了,发个文章庆祝一下
  13. vs2013编译驱动错误-Inf2Cat,signability test failed
  14. python批量读取txt_python如何批量读取txt文件
  15. 三亚科技创新创业大赛完美落幕,珈和科技等五个企业获一等奖
  16. java wav合并_java – 如何将两个wav文件合并/合并到一个wav文件中?
  17. 电商项目之收货地址理解
  18. 草料二维码生成器怎么连接打通其他应用?
  19. 简单示例mock的使用 (Junit结合Jmock)
  20. no cortex-m sw device found 问题解决【转】

热门文章

  1. C库源码中的移位函数
  2. 舵机的使用方法和一些注意事项
  3. 2014 BAT 面试经验 自律用~
  4. 计算捐款总量 (10 分)
  5. 计算机网络技术课程答案网课,《计算机网络技术》大学生网课答案.docx
  6. 【Unity 题型】脚本开发
  7. (十八)Flink Table API SQL 编程指南 Table API 和Datastream API 集成
  8. ExpandableListView 去掉默认箭头,设置成别的图片
  9. 【043】光盘库编码
  10. Oracle总结一(超详细)