又是全网首创/纯Qt实现28181设备模拟器/rtp视频点播/桌面转28181/任意文件转28181/跨平台

一、前言说明

这个工具前前后后也算是废了不少功夫,最开始是因为28181服务端的组件已经完美实现,对照国标文档看了很多遍,逐个实现需要的交互协议,整体上比onvif协议要难不少,主要是涉及到的东西比较多,有sip协议,又有xml数据封装,云台控制用的又是模拟设备时代的16进制数据来控制,音视频传输用的又是单独的rtp,而播放控制用的又是rtsp中的控制指令,哎呀我去全部杂交啊,一般人没个几个月搞不定的,发量越来越少是肯定的。

能够把28181的服务端搞定,那设备端的指令就简单多了,底层其实就是udp和tcp通信,根据收到的数据进行解析和交互即可,按照国标文档来就行,肯定错不了,如果错了那肯定是对应平台或者设备厂家有问题没写好。设备端最大难点困在如何发送视频rtp数据这里,一直在想要不要用第三方的轮子比如jrtp,好在之前就对ffmpeg推流很熟悉了,尝试了直接推流rtp,一开始死活不行,后面发现原来格式不对,国标要求的是rtp携带ts格式的数据包,对应不应该是rtp格式而应该是rtp_mpegts,相当于rtp over mpegts,其实udp推流这种就是mpegts格式,这个细节网上很少人提到,搞得这里困了很多天,以为ffmpeg实现不了,原来用纯ffmpeg就可以直接实现的。

二、效果图

在这里插入图片描述
在这里插入图片描述

三、相关地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_simulate。

四、功能特点

  1. 标准onvif协议,支持设备搜索、获取参数、快照抓图等。
  2. 支持264/265/aac等标准视音频协议传输。
  3. 支持多路批量onvif设备模拟,每一路都独立的端口。
  4. 支持本地摄像头采集转成onvif,可选择不同的设备、分辨率、帧率等参数。
  5. 支持本地桌面采集转成onvif,可选择不同的屏幕、分辨率、帧率等参数。
  6. 支持各种视频文件和视频流转成onvif,可重新设置编码转换以及分辨率转换。
  7. 支持4K、8K等高清分辨率,不限制分辨率,非264/265会自动转码推流。
  8. 每一路都可以设置统一或者独立的用户验证信息,为空则表示不验证。
  9. 可以把任意内容接入到NVR以及视频监控系统,方便保存录像文件,以便回放可查。
  10. 也可作为压力测试工具,比如模拟几千路onvif设备,让集成平台软件做接入压力测试。
  11. 推出去的流不仅有rtsp格式,还支持rtmp、http、flv、ws-flv、webrtc等方式访问,可以直接网页查看。
  12. 在管理工具上可以看到每一路的推流状况以及分辨率信息,非常直观。
  13. 支持自动重连拉流,重连推流,保证7乘以24小时稳定运行。
  14. 可设置开机自启动运行和后台运行,不显示在任务栏,作为后台服务运行。
  15. 可批量添加文件、添加目录,自动将目录下的所有文件添加到模拟器。
  16. 多功能添加地址面板,可以选择本地设备和监控设备,本地设备会自动识别摄像头设备和桌面设备,监控设备可以选择不同厂家,自动填充对应rtsp格式,填入用户信息即可,可以批量递增添加监控设备。
  17. 可无缝上传到市面上所有的onvif协议设备,包括海康、大华、宇视、华为、天地伟业等,也支持ONVIF Device Manager国际onvif工具。
  18. 支持gb28181设备模拟,具备设备注册、设备注销、设备心跳、设备信息、设备配置、设备状态应答等。
  19. 支持模拟报警和位置上报等,方便平台侧显示对应设备的实时位置。
  20. 支持一键添加批量模拟28181设备,实时显示已注册和已注销状态。
  21. 支持将本地桌面、本地摄像头、任意视频文件、视频流文件、手机摄像头等转换成28181设备,添加到NVR或者国标软件平台。
  22. sip协议同时支持udp和tcp两种通信方式,视频点播同时支持udp/tcp主动/tcp被动三种方式,涵盖所有可能的场景需求。
  23. 无论是onvif设备模拟组件还是28181设备模拟组件,全部原创底层协议解析,纯Qt实现,跨任意平台。
  24. 代码结构框架非常清晰,注释详细,代码精简不繁琐,非常易于学习和移植,可以很容易拓展其他接口需求。
  25. 支持Qt4/Qt5/Qt6以及后续所有版本、所有编译器、所有开发环境。
  26. 支持windows、linux、mac、国产OS、嵌入式linux、RK3588、树莓派、香橙派等系统。

五、相关代码

#include "gb28181devicepush.h"
#include "ffmpegthread.h"
#include "ffmpegsave.h"
#include "videohelper.h"
#include "osdgraph.h"bool GB28181DevicePush::disableDecode = true;
GB28181DevicePush::GB28181DevicePush(QObject *parent) : QObject(parent)
{ffmpegThread = NULL;
}GB28181DevicePush::~GB28181DevicePush()
{this->stop();
}void GB28181DevicePush::setPara(const QString &flag, const QString &mediaUrl, const QString &pushUrl)
{this->flag = flag;this->mediaUrl = mediaUrl;this->pushUrl = pushUrl;
}bool GB28181DevicePush::isOk()
{return (ffmpegThread != NULL);
}void GB28181DevicePush::start()
{if (ffmpegThread || mediaUrl.isEmpty() || pushUrl.isEmpty()) {return;}//实例化视频采集线程ffmpegThread = new FFmpegThread;//关联播放开始信号/用来启动推流connect(ffmpegThread, SIGNAL(receivePlayStart(int)), this, SLOT(receivePlayStart(int)));//关联录制信号变化/用来判断是否推流成功connect(ffmpegThread, SIGNAL(recorderStateChanged(RecorderState, QString)), this, SLOT(recorderStateChanged(RecorderState, QString)));//设置保存视频类将数据包信号发出来用于保存文件FFmpegSave *saveFile = ffmpegThread->getSaveFile();saveFile->setProperty("ssrc", flag);connect(saveFile, SIGNAL(receiveSaveStart()), this, SLOT(receiveSaveStart()));connect(saveFile, SIGNAL(receiveSaveFinsh()), this, SLOT(receiveSaveFinsh()));connect(saveFile, SIGNAL(receiveSaveError(int)), this, SLOT(receiveSaveError(int)));    //设置播放地址ffmpegThread->setMediaUrl(mediaUrl);//设置视频模式ffmpegThread->setVideoMode(VideoMode_Painter);//设置读取超时时间超时后会自动重连ffmpegThread->setReadTimeout(10 * 1000);//设置连接超时时间ffmpegThread->setConnectTimeout(0);//设置重复播放相当于循环推流ffmpegThread->setPlayRepeat(true);//设置不解码音频ffmpegThread->setDecodeAudio(false);//设置不解码数据ffmpegThread->setDisableDecode(disableDecode);//如果是本地设备或者桌面录屏要取出其他参数VideoHelper::initVideoPara(ffmpegThread, mediaUrl);//启动播放ffmpegThread->play();
}void GB28181DevicePush::stop()
{//停止推流和采集并彻底释放对象if (ffmpegThread) {ffmpegThread->recordStop();ffmpegThread->stop();ffmpegThread->deleteLater();ffmpegThread = NULL;}
}void GB28181DevicePush::receivePlayStart(int time)
{//演示添加OSD后推流
#ifdef betaversionint height = ffmpegThread->getVideoHeight();QList<OsdInfo> osds = OsdGraph::getTestOsd(height);ffmpegThread->setOsdInfo(osds);
#endif//打开后才能启动录像ffmpegThread->recordStart(pushUrl);
}void GB28181DevicePush::recorderStateChanged(const RecorderState &state, const QString &)
{int width = 0;int height = 0;if (ffmpegThread) {width = ffmpegThread->getVideoWidth();height = ffmpegThread->getVideoHeight();}bool start = (state == RecorderState_Recording);emit pushStart(flag, width, height, start);
}void GB28181DevicePush::receiveSaveStart()
{emit pushChanged(flag, 0);
}void GB28181DevicePush::receiveSaveFinsh()
{emit pushChanged(flag, 1);
}void GB28181DevicePush::receiveSaveError(int)
{emit pushChanged(flag, 2);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96271.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓逆向(一)Ubuntu环境配置

一、Ubuntu 1、虚拟机 首先准备一个Ubuntu的虚拟机&#xff0c;就随便新建一个就行&#xff0c;我这里使用的是Ubuntu21.04&#xff0c;但是内存跟硬盘大小最好设置的稍微大一点。 2、基础环境 &#xff08;1&#xff09;解决apt-get update报错问题 apt-get是Linux系统中一个管…

Go 1.25在性能方面做了哪些提升?

Go 1.25 在性能方面带来了多项重要提升&#xff0c;主要有以下几个方面&#xff1a; 实验性垃圾回收器 GreenTea GC&#xff1a;针对小对象密集型应用优化&#xff0c;显著提升小对象标记和扫描性能&#xff0c;垃圾回收开销减少0-40%&#xff0c;暂停时间缩短&#xff0c;吞吐…

Python与XML文件处理详解(2续):xml.dom.minidom模块高阶使用方法

目录 第一部分:高级节点操作与遍历方法 1.1 更精确的节点导航 1.2 使用 cloneNode() 复制节点 1.3 节点插入、替换与高级管理 第二部分:文档创建与高级输出控制 2.1 使用 Document 工厂方法完整创建文档 2.2 高级输出与序列化控制 第三部分:实用工具函数与模式处理 …

如何利用 ChatGPT 辅助写作

引言 介绍人工智能辅助写作的兴起&#xff0c;ChatGPT 在写作领域的应用潜力&#xff0c;以及本文的核心目标。 ChatGPT 在写作中的核心功能 概述 ChatGPT 的主要功能&#xff0c;包括文本生成、润色、结构优化、灵感激发等。 利用 ChatGPT 辅助写作的具体方法 生成创意与灵感 …

【有鹿机器人自述】我在社区的365天:扫地、卖萌、治愈人心

大家好&#xff0c;我是有鹿巡扫机器人&#xff0c;编号RD-07。今天我想和大家分享这一年来的工作见闻——没错&#xff0c;我们机器人也会"观察"和"感受"&#xff0c;尤其是在连合直租将我送到这个社区后&#xff0c;发生的点点滴滴让我拥有了前所未有的&…

第五十五天(SQL注入增删改查HTTP头UAXFFRefererCookie无回显报错复盘)

#数据库知识&#xff1a; 1、数据库名&#xff0c;表名&#xff0c;列名&#xff0c;数据 2、自带数据库&#xff0c;数据库用户及权限 3、数据库敏感函数&#xff0c;默认端口及应用 4、数据库查询方法&#xff08;增加删除修改更新&#xff09; #SQL注入产生原理&#xf…

怎么用 tauri 创建一个桌面应用程序(Electron)

以前用 Electron 做过一个桌面应用程序&#xff0c;打包体积确实很大&#xff0c;启动也很慢。这次先 tauri。 并且用 bun 代替 npm 速度更快&#xff0c;避免总是出现依赖问题。 前端用 react 为了学习下&#xff0c;用 js 先现在主流的 typescript。 安装 bun npm instal…

【通过Docker快速部署Tomcat9.0】

文章目录前言一、部署docker二、部署Tomcat2.1 创建存储卷2.2 运行tomcat容器2.3 查看tomcat容器2.4 查看端口是否监听2.5 防火墙开放端口三、访问Tomcat前言 Tomcat介绍 Tomcat 是由 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;开发的一个开源 Jav…

LabVIEW UI 分辨率适配

针对 LabVIEW UI 在不同分辨率下的适配&#xff0c;现有方案分三类&#xff1a;一是现有 VI 可通过 “VI 属性 - 窗口大小” 勾选比例保持或控件缩放选项快速调整&#xff0c;也可取消勾选或换等宽字体防控件移位&#xff1b;二是项目初期以最低目标分辨率为基准&#xff0c;用…

国产化FPGA开发板:2050-基于JFMK50T4(XC7A50T)的核心板

&#xff08;IEB-PS-3051-邮票孔&#xff09; 一、核心板概述 板卡基于JFMK50T4国产化FPGA芯片&#xff0c;设计的一款工业级核心板&#xff0c;板卡集成主芯片、电源、DDR、配置芯片&#xff0c;大大减轻客户的扩展开发困难。丰富的IO和4个GTP&#xff0c;让用户轻…

Webpack 核心原理剖析

时至今日&#xff0c;Webpack 已迭代到 5.x 版本&#xff0c;其功能模块的扩充和复杂度的提升使得源码学习成本陡增。官方文档的晦涩表述更是让许多开发者望而却步。然而&#xff0c;理解 Webpack 的核心原理对优化构建流程、定制化打包方案至关重要。本文将通过简化流程和代码…

移植Qt4.8.7到ARM40-A5

移植Qt4.8.7到ARM40-A5 主机平台&#xff1a;Ubuntu 16.04 LTS(x64) 目标平台&#xff1a;ARM40-A5 Qt版本&#xff1a;Qt4.8.7 ARM GCC编译工具链&#xff1a; arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 ----------## Qt移植步骤 ## 1、了解Ubuntu&am…

C++_哈希

1. unordered系列关联式容器在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到$log_2 N$&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xf…

Redis 内存管理机制:深度解析与性能优化实践

&#x1f9e0; Redis 内存管理机制&#xff1a;深度解析与性能优化实践 文章目录&#x1f9e0; Redis 内存管理机制&#xff1a;深度解析与性能优化实践&#x1f9e0; 一、Redis 内存架构全景&#x1f4a1; Redis 内存组成结构&#x1f4ca; 内存占用分布示例⚙️ 二、内存分配…

cargs: 一个轻量级跨平台命令行参数解析库

目录 1.简介 2.安装与集成 3.项目的目录结构及介绍 4.核心数据结构与函数 5.基本使用示例 6.应用案例和最佳实践 7.高级用法 8.与其他库的对比 9.总结 1.简介 cargs 是一个轻量级、无依赖的 C 语言命令行参数解析库&#xff0c;虽然本身是 C 库&#xff0c;但可以无缝…

【数学建模】质量消光系数在烟幕遮蔽效能建模中的核心作用

前言&#xff1a;欢迎各位光临本博客&#xff0c;这里小编带你直接手撕质量相关系数&#xff0c;文章并不复杂&#xff0c;愿诸君耐其心性&#xff0c;忘却杂尘&#xff0c;道有所长&#xff01;&#xff01;&#xff01;&#xff01; **&#x1f525;个人主页&#xff1a;IF’…

Java代码审计实战:XML外部实体注入(XXE)深度解析

Java代码审计实战&#xff1a;XML外部实体注入&#xff08;XXE&#xff09;深度解析XML外部实体注入&#xff08;XXE&#xff09;是Web应用程序中一种常见但又常常被忽视的漏洞。它利用了XML解析器解析XML文档时&#xff0c;允许引用外部实体这个特性。如果解析器没有禁用外部实…

当服务器出现网卡故障时如何检测网卡硬件故障并解决?

当服务器出现网卡故障时&#xff0c;可能导致网络通信中断&#xff0c;从而影响业务的正常运行。以下是检测网卡硬件故障、诊断问题并解决的详细方法和步骤。1. 网卡故障的常见表现1.1 硬件故障的常见症状网络无法连接&#xff1a;服务器无法访问外部网络或用户无法连接到服务器…

从车辆中心到用户中心:E/E架构的变革与挑战

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

RPC内核细节(转载)

RPC内核细节(转载) 背景 随着数据量、并发量、业务复杂度的增长&#xff0c;服务化是架构演进必由之路。服务化离不开RPC框架。 RPC服务化的好处 服务化的一个好处就是&#xff0c;不限定服务的提供方使用什么技术选型&#xff0c;能够实现大公司跨团队的技术解耦。 如下图…