一、前言

最近遇到个需求是通过外网接入摄像机或者NVR,通用的做法是将视频流推流到服务器,然后拉取rtmp视频流,这样就多了服务器的要求,而且实现的功能有限比如不能直接用onvif协议对设备获取信息和配置信息,还有个做法就是将设备直接通过路由器端口映射到外网,根据外网的IP地址和端口对应填入即可。先不考虑安全问题,因为现在设备厂家几乎对安全性做的比较好,登录和onvif交互等,都需要用户验证,甚至还可以开启https机制。

通过端口映射后外网确实可以正常访问到设备,比如网页打开登录,但是通过onvif消息交互就未必正确了,需要调整代码,比如获取到的视频流地址是rtsp://192.168.0.5:554/1,由于经过了端口映射,所以你需要将这个onvif交互中的IP地址和端口都要换成映射后的地址和端口,否则不能正常访问使用,由于设备本身并不知道你做过端口映射,他只会应答自己本身的信息打包发出去,所以需要在onvif代码中将对应地址替换,取onvif地址中的IP地址即可,当然也有可能是需要微调的,比如设备多个的时候经过一个路由器端口有限,一个554端口只能对应映射到一个设备的554端口,其他设备要改成其他端口,这就需要将获取到的地址后的端口再手动修改即可。

通过onvif机制和外网摄像头设备交互,和内网比较,就差一个不能实现,那就是广播搜索设备,因为在外网上,不存在发个广播消息,设备可以接收到的,毕竟互联网上的设备万亿计算。除了这个无法实现以外,其他都正常,包括设置图片参数(明亮度、饱和度、对比度、尖锐度),云台控制、预置位相关操作都ok。由于无法广播搜索设备,需要对外网的设备挨个单播搜索获取详细的设备信息,本系统封装好的onvif组件支持单播搜索,填入IP地址和端口即可。

可以通过端口映射,外网访问摄像头或者NVR等,基本步骤如下:

  1. 进入到路由器配置界面,查看分配的外网IP地址,记下来。
  2. 进入到端口映射配置界面,不同路由器位置不一样,可以找找端口映射之类的字眼,也可能叫虚拟服务器。
  3. 添加对应的端口映射信息,外部端口对应外部访问该设备的端口,内部端口对应之前内网访问该设备的端口。
  4. 在设备搜索那边指定设备填入IP地址和端口,单击单播搜索按钮,会自动搜索到设备的onvif地址,然后填入onvif用户信息,此时再去单击获取所有,如果有返回信息则表示正常。

二、效果图







三、体验地址

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

四、相关代码

void OnvifQuery::checkAddr(const QString &ipport, QString &addr, bool checkOnvif, bool replacePort)
{
QStringList list = addr.split("/");
if (addr.isEmpty() || list.count() <= 3) {
return;
} //将内网的地址换成外网的(新增设备映射到外网后返回的数据中内网地址转换成外网的)
if (replacePort) {
list[2] = ipport;
} else {
//只替换IP地址
list[2] = ipport.split(":").first();
} //将地址补全字符串(测试发现天地伟业的摄像机返回的地址都是没有带onvif字样的需要补上才行)
//http://192.168.0.160:80/Media 要转成 http://192.168.0.160:80/onvif/Media
if (checkOnvif && !addr.contains("/onvif/")) {
list.insert(3, "onvif");
} addr = list.join("/");
} OnvifHttpAddr OnvifQuery::getServices(const QString &ipport)
{
//<tds:Namespace>http://www.onvif.org/ver10/media/wsdl</tds:Namespace>
//<tds:XAddr>http://192.168.0.160:80/Media</tds:XAddr>
//<tds:Namespace>http://www.onvif.org/ver20/ptz/wsdl</tds:Namespace>
//<tds:XAddr>http://192.168.0.160:80/PTZ</tds:XAddr> OnvifHttpAddr httpAddr; //取出来时刚好按照顺序一一对应
QDomNodeList nodeNamespace = doc.elementsByTagName(QString("%1:Namespace").arg(wsdlAddr.wsdlDevice));
QDomNodeList nodeXAddr = doc.elementsByTagName(QString("%1:XAddr").arg(wsdlAddr.wsdlDevice));
int size1 = nodeNamespace.size();
int size2 = nodeXAddr.size();
if (size1 == size2) {
for (int i = 0; i < size1; ++i) {
QString name = nodeNamespace.at(i).toElement().text();
QString addr = nodeXAddr.at(i).toElement().text();
this->checkAddr(ipport, addr, true, true); //可以自行增加其他的
if (name == "http://www.onvif.org/ver10/device/wsdl") {
httpAddr.addrDevice = addr;
} else if (name == "http://www.onvif.org/ver10/media/wsdl") {
httpAddr.addrMedia = addr;
} else if (name == "http://www.onvif.org/ver20/media/wsdl") {
httpAddr.addrMedia2 = addr;
} else if (name == "http://www.onvif.org/ver20/ptz/wsdl") {
httpAddr.addrPtz = addr;
} else if (name == "http://www.onvif.org/ver20/imaging/wsdl") {
httpAddr.addrImaging = addr;
} else if (name == "http://www.onvif.org/ver10/events/wsdl") {
httpAddr.addrEvents = addr;
} else if (name == "http://www.onvif.org/ver20/analytics/wsdl") {
httpAddr.addrAnalytics = addr;
}
}
} return httpAddr;
}

五、功能特点

(一)、软件模块

  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. 支持onvif图像参数设置,包括明亮度、对比度、饱和度、尖锐度等。
  24. 支持onvif其他操作,包括抓图、网络设置、校时、重启、事件订阅等。
  25. 支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
  26. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
  27. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
  28. 可设置软件中文名称、英文名称、LOGO图标等。
  29. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。
  30. 完善的录像计划设置,支持每个通道7乘24小时每半小时设置是否存储录像。

(三)、特色功能

  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、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
  17. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

Qt编写视频监控系统71-外网访问摄像头等设备(获取各种信息及拉流)的更多相关文章

  1. Qt编写视频监控画面分割界面(开源)

    其实qt应用在安防领域还是蛮多的,尤其是视频监控系统,但是网上几乎没有看到qt做的最基础的视频监控画面分割的demo,今天特意花几分钟提取出来,开源放出来.欢迎大家多多点赞!源码下载:点击打开链接 运 ...

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

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

  3. Qt编写安防视频监控系统18-云台控制

    一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...

  4. Qt编写安防视频监控系统12-异形布局

    一.前言 视频监控系统中,除了常规的1画面.4画面.9画面.16画面以外,还有几个布局比较另类,比如6画面.8画面.13画面,有些通道需要占据不同的行列,4画面.9画面.16画面都是非常对称的布局,行 ...

  5. Qt编写安防视频监控系统11-动态换肤

    一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据 ...

  6. Qt编写安防视频监控系统9-自动隐藏光标

    一.前言 这个效果的灵感来自于大屏电子看板系统,在很多系统中尤其是上了大屏的时候,其实在用户不在操作的时候,是很不希望看到那个鼠标箭头指针的,只有当用户操作的时候才显示出来,这个就需要开个定时器定时计 ...

  7. Qt编写安防视频监控系统8-双击节点

    一.前言 在所有的视频监控系统中,双击摄像机的节点,对应摄像机加载到当前焦点通道显示,这个都是必须具备的功能,还有一些厂家会做双击NVR节点,自动加载该NVR下的所有摄像机全部显示,从通道1开始到通道 ...

  8. Qt编写安防视频监控系统7-全屏切换

    一.前言 全屏切换这个功能点属于简单的,一般会做到右键菜单中,也提供了快捷键比如alt+enter来触发,恢复全屏则按esc即可,全屏处理基本上都是隐藏通道面板以外的窗体,保持最大化展示,由于采用了模 ...

  9. Qt编写安防视频监控系统5-视频回放

    一.前言 一般视频回放都会采用GB28181国标来处理,这样可以保证兼容国内各大厂家的NVR,毕竟在同一的国家标准下,大家都会统一支持国标的,就不需要根据各个厂家的SDK来做兼容处理,烦得很,厂家越来 ...

  10. Qt编写安防视频监控系统3-通道交换

    一.前言 最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡还很慢,毕竟重新打开视频都需要 ...

随机推荐

  1. 说一下tcp三次握手

    1. 客户端发送syn请求连接 : 2. 服务器检验syn,然后发送syn和ack确认连接: 3. 客户端接收ack和syn,然后发送ack建立连接 :

  2. oracle中排序分析函数row_number()、rank()、dense_rank() 的区别,与rownum的注意事项

    row_number()产生的序号不会重复,即1.2.3... rank()产生的序号会重复,但是会跳号,出现1.2.2.4...的情况 dense_rank()产生的序号会重复,不会跳号,会出现1. ...

  3. Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复(精华)

    Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复 炎炎夏夜客户机房空调意外故障,前端ESXI物理服务器由于温度过高都自保关机,存储和SAN没有自保关机.上班修复空调后, ...

  4. Windows 记录一次磁盘相关的PC卡顿问题

    我的电脑最近经常抽疯,时不时卡顿一次 检查系统事件日志,会有这俩个: 发出了对设备 \Device\RaidPort0 的重置. 已在磁盘 0 (PDO 名称: \Device\0000003a)的逻 ...

  5. vue3 + h5 构建流程

    目录 目录 初始化项目架构 技术栈 工具类 环境 搭建流程 初始化项目 初始化git 运行项目 配置 server环境 vite.config.ts 配置项目环境 增加三个文件 修改package.j ...

  6. 如何在离线的Linux服务器上部署 Ollama,并使用 Ollama 管理运行 Qwen 大模型

    手动安装 Ollama 根据Linux的版本下载对应版本的 Ollama, 查看Linux CPU型号,使用下面的命令 #查看Linux版本号 cat /proc/version #查看cpu架构 l ...

  7. Python运行报错:ImportError: cannot import name 'BinarySpaceToDiscreteSpaceEnv' from 'nes_py.wrappers'

    运行Python项目: https://pypi.org/project/gym-super-mario-bros/ 报错: ImportError: cannot import name 'Bina ...

  8. MathType 使用技巧

    matytype: 一次性更改所有公式的字体. 在安装有MathType的Word中,我们可以选中 mathtype 公式,用 alt+\ 切换为Latex语句,反之亦然.例如:$a_b$ 变为 ab ...

  9. MFC应用当中,修改tab顺序

    打开资源文件,按"Ctrl+D"组合键,可以查看控件的Tab顺序,使用鼠标顺序点击即可改变Tab顺序,此方法在Visual Studio 2022版本有效,其余版本没有测试过.

  10. Frida 问题集锦

    1. 使用过程中少用this Activity.onStart.implementation = function() { console.log('onStart: ' + this); this. ...