Qt/C++音视频开发49-推流到各种流媒体服务程序

一、前言

最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不仅同时支持rtsp/rtmp推流,还支持各种格式rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,涵盖面非常全,而且拉流的画面非常流畅,在局域网没有出现花屏的现象,对视频文件、视频流支持都非常友好。

为了增强程序的拓展性,以便适应后期增加其他流媒体服务器程序,特意将流媒体服务程序的信息用配置文件存取来,可以自行增删改,推流和拉流对应的端口都可以自行修改,这样非常适用于一台电脑多种流媒体服务,通过配置不同的端口来保证同时推流到多个流媒体服务程序,比如windows系统554端口很可能被系统的进程占用,所以需要更改为其他端口,在流媒体服务程序对应的配置文件更改后,还需要在推流程序对应的配置文件中修改,这样后期如果增加了其他的流媒体服务程序,只需要在配置文件增加即可,程序会自动读取并加载到下拉框。

二、效果图

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

三、体验地址

  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_push。

四、功能特点

  1. 支持各种本地视频文件和网络视频文件。
  2. 支持各种网络视频流,网络摄像头,协议包括rtsp、rtmp、http。
  3. 支持将本地摄像头设备推流,可指定分辨率和帧率等。
  4. 支持将本地桌面推流,可指定屏幕区域和帧率等。
  5. 自动启动流媒体服务程序,默认mediamtx(原rtsp-simple-server),可选用srs、EasyDarwin、LiveQing、ZLMediaKit等。
  6. 可实时切换预览视频文件,可切换视频文件播放进度,切换到哪里就推流到哪里。
  7. 推流的清晰度和质量可调。
  8. 可动态添加文件、目录、地址。
  9. 视频文件自动循环推流,如果视频源是视频流,在掉线后会自动重连。
  10. 网络视频流自动重连,重连成功自动继续推流。
  11. 网络视频流实时性极高,延迟极低,延迟时间大概在100ms左右。
  12. 极低CPU占用,4路主码流推流只需要占用0.2%CPU。理论上常规普通PC机器推100路毫无压力,主要性能瓶颈在网络。
  13. 推流可选推流到rtsp/rtmp两种,推流后的数据支持直接rtsp/rtmp/hls/webrtc四种方式访问,可以直接浏览器打开看实时画面。
  14. 可以推流到外网服务器,然后通过手机、电脑、平板等设备播放对应的视频流。
  15. 每个推流都可以手动指定唯一标识符(方便拉流/用户无需记忆复杂的地址),没有指定则按照策略随机生成hash值。
  16. 自动生成测试网页直接打开播放,可以看到实时效果,自动按照数量对应宫格显示。
  17. 推流过程中可以在表格中切换对应推流项,实时预览正在推流的视频,并可以切换视频文件的播放进度。
  18. 音视频同步推流,符合264/265/aac格式的自动原数据推流,不符合的自动转码再推流(会占用一定CPU)。
  19. 转码策略支持三种,自动处理(符合要求的原数据/不符合的转码),仅限文件(文件类型的转码视频),所有转码。
  20. 表格中实时显示每一路推流的分辨率和音视频数据状态,灰色表示没有输入流,黑色表示没有输出流,绿色表示原数据推流,红色表示转码后的数据推流。
  21. 自动重连视频源,自动重连流媒体服务器,保证启动后,推流地址和打开地址都实时重连,只要恢复后立即连上继续采集和推流。
  22. 提供循环推流示例,一个视频源同时推流到多个流媒体服务器,比如打开一个视频同时推流到抖音/快手/B站等,可以作为录播推流,列表循环,非常方便实用。
  23. 根据不同的流媒体服务器类型,自动生成对应的rtsp/rtmp/hls/flv/ws-flv/webrtc地址,用户可以直接复制该地址到播放器或者网页中预览查看。
  24. 编码视频格式可以选择自动处理(源头是264就264/源头是265就265),转H264(强制转264),转H265(强制转265)。
  25. 支持Qt4/Qt5/Qt6任意版本,支持任意系统(windows/linux/macos/android/嵌入式linux等)。

五、相关代码

QList<QString> VideoPushUrl::listPushType = QList<QString>();
QList<QString> VideoPushUrl::listPullType = QList<QString>();
QList<int> VideoPushUrl::listPullPort = QList<int>();void VideoPushUrl::initServerInfo()
{listPushType.clear();listPullType.clear();listPullPort.clear();listPushType << "mediamtx" << "mediamtx" << "mediamtx" << "mediamtx";listPullType << "rtsp" << "rtmp" << "hls" << "webrtc";listPullPort << 8554 << 1935 << 8888 << 8889;listPushType << "LiveQing" << "LiveQing" << "LiveQing" << "LiveQing" << "LiveQing";listPullType << "rtmp" << "hls" << "flv" << "ws-flv" << "webrtc";listPullPort << 10085 << 18000 << 18000 << 18000 << 18000;listPushType << "EasyDarwin";listPullType << "rtsp";listPullPort << 5541;listPushType << "nginx-rtmp";listPullType << "rtmp";listPullPort << 1935;listPushType << "ZLMediaKit" << "ZLMediaKit" << "ZLMediaKit" << "ZLMediaKit" << "ZLMediaKit" << "ZLMediaKit";listPullType << "rtsp" << "rtmp" << "hls" << "flv" << "ws-flv" << "webrtc";listPullPort << 554 << 1935 << 80 << 80 << 80 << 80;listPushType << "srs" << "srs" << "srs" << "srs";listPullType << "rtmp" << "hls" << "flv" << "webrtc";listPullPort << 1935 << 8080 << 8080 << 8080;listPushType << "ABLMediaServer" << "ABLMediaServer" << "ABLMediaServer" << "ABLMediaServer" << "ABLMediaServer";listPullType << "rtsp" << "rtmp" << "hls" << "flv" << "ws-flv";listPullPort << 554 << 1935 << 9088 << 8088 << 6088;
}void VideoPushUrl::initServerInfo(const QString &fileName)
{listPushType.clear();listPullType.clear();listPullPort.clear();QFile file(fileName);if (file.open(QFile::ReadOnly | QFile::Text)) {while (!file.atEnd()) {QString content = file.readLine();content.replace("\r", "");content.replace("\n", "");if (content.isEmpty()) {continue;}QStringList list = content.split(",");if (list.count() == 3) {listPushType << list.at(0);listPullType << list.at(1);listPullPort << list.at(2).toInt();}}}
}QStringList VideoPushUrl::getPushType()
{QStringList types;foreach (QString type, listPushType) {if (!types.contains(type)) {types << type;}}return types;
}QString VideoPushUrl::getPushPath(const QString &pushUrl)
{//("rtsp:", "", "127.0.0.1:5541") ("rtsp:", "", "127.0.0.1:5541", "live") ("rtsp:", "", "127.0.0.1:5541", "live/test")QString path = "/";QStringList list = pushUrl.split("/");int count = list.count();//从第三位开始后面所有的都是资源目录for (int i = 3; i < count; ++i) {path = path + list.at(i) + "/";}//末尾的斜杠去掉return path.mid(0, path.length() - 1);
}int VideoPushUrl::getPullPort(const QString &pushType, const QString &pullType)
{int port = 80;int count = listPushType.count();for (int i = 0; i < count; ++i) {if (listPushType.at(i) == pushType && listPullType.at(i) == pullType) {port = listPullPort.at(i);break;}}return port;
}//各种拉流协议分析 https://www.cnblogs.com/xi-jie/p/14031604.html
QString VideoPushUrl::getPullUrl(const QString &pushUrl, const QString &pushType, const QString &pullType, const QString &ip, const QString &flag)
{//找到对应服务器类型和拉流类型的端口int port = getPullPort(pushType, pullType);//资源目录(可以为空)QString path = getPushPath(pushUrl);//去掉特殊字符比如?QString name = flag.split("?").first();//根据服务器类型获取对应的地址QString url = QString("://%1:%2%3/%4").arg(ip).arg(port).arg(path).arg(name);if (pushType == "mediamtx") {//同时支持rtsp/rtmp推拉流(非常棒)if (pullType == "rtsp") {url = "rtsp" + url;} else if (pullType == "rtmp") {url = "rtmp" + url;} else if (pullType == "hls") {url = "http" + url;} else if (pullType == "webrtc") {url = "http" + url;}} else if (pushType == "LiveQing") {//只支持rtmp推流if (pullType == "rtmp") {url = QString("rtmp://%1:%2/hls/%3").arg(ip).arg(port).arg(name);} else if (pullType == "hls") {url = QString("http://%1:%2/hls/%3/%3_live.m3u8").arg(ip).arg(port).arg(name);} else if (pullType == "flv") {url = QString("http://%1:%2/flv/hls/%3.flv").arg(ip).arg(port).arg(name);} else if (pullType == "ws-flv") {url = QString("ws://%1:%2/ws-flv/hls/%3.flv").arg(ip).arg(port).arg(name);} else if (pullType == "webrtc") {url = QString("webrtc://%1:%2/rtc/hls/%3").arg(ip).arg(port).arg(name);}} else if (pushType == "EasyDarwin") {//只支持rtsp推流拉流if (pullType == "rtsp") {url = "rtsp" + url;}} else if (pushType == "nginx-rtmp") {//只支持rtmp推流拉流if (pullType == "rtmp") {url = "rtmp" + url;}} else if (pushType == "ZLMediaKit") {//同时支持rtsp/rtmp推拉流(名气最大/用户最多)if (pullType == "rtsp") {url = "rtsp" + url;} else if (pullType == "rtmp") {url = "rtmp" + url;} else if (pullType == "hls") {url = "http" + url + "/hls.m3u8";} else if (pullType == "flv") {url = "http" + url + ".live.flv";} else if (pullType == "ws-flv") {url = "ws" + url + ".live.flv";} else if (pullType == "webrtc") {}} else if (pushType == "srs") {//不支持rtsp推流拉流(以前支持/后面都移除了)if (pullType == "rtmp") {url = "rtmp" + url;} else if (pullType == "hls") {url = "http" + url + ".m3u8";} else if (pullType == "flv") {url = "http" + url + ".flv";} else if (pullType == "webrtc") {url = "webrtc" + url;}} else if (pushType == "ABLMediaServer") {//支持rtsp/rtmp推流拉流(目前还不稳定/兼容性不够好)if (pullType == "rtsp") {url = "rtsp" + url;} else if (pullType == "rtmp") {url = "rtmp" + url;} else if (pullType == "hls") {url = "http" + url + ".m3u8";} else if (pullType == "flv") {url = "http" + url + ".flv";} else if (pullType == "ws-flv") {url = "ws" + url + ".flv";}} else if (pushType == "Monibuca") {//支持rtsp/rtmp推流拉流(拉流格式众多/各种插件/性能很强劲/具体有待验证)if (pullType == "rtsp") {url = "rtsp" + url;} else if (pullType == "rtmp") {url = "rtmp" + url;} else if (pullType == "hls") {url = QString("http://%1:%2/hls%3/%4.m3u8").arg(ip).arg(port).arg(path).arg(name);} else if (pullType == "flv") {url = QString("http://%1:%2/hdl%3/%4.flv").arg(ip).arg(port).arg(path).arg(name);} else if (pullType == "ws-flv") {url = QString("ws://%1:%2/jessica%3/%4.flv").arg(ip).arg(port).arg(path).arg(name);} else if (pullType == "webrtc") {url = QString("webrtc://%1:%2/webrtc/play%3/%4").arg(ip).arg(port).arg(path).arg(name);}}return url;
}

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

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

相关文章

QT DAY6

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);socket new QTcpSocket(this);//如果连接服务器成功&#xff0c;该客户端就会发射一个connected的信号。//我们…

MyBatis关系映射

文章目录 前言一、一对一映射1.1 创建实体1.2 xml配置 二、一对多映射2.1 创建实体2.2 resultMap配置2.3 测试 三、 多对多映射3.1 创建实体3.2 resultMap配置3.3 测试 前言 MyBatis是一个Java持久化框架&#xff0c;它提供了一种将数据库表和Java对象之间进行关系映射的方式。…

css画箭头图标放标题前面,旋转,border的单个边框设置

CSS边框属性_css border dotted_小张biubiu的博客-CSDN博客 你还不知道css的旋转效果怎么实现&#xff1f;来这里看看吧_css旋转效果_我糖呢的博客-CSDN博客 .sub-title{position: relative;margin-left: 59px;& span{color: #1CDBFE;};& span::before{content: "…

算法通关村十四关:青铜-堆结构

青铜挑战-堆结构 堆结构&#xff1a;重要的基础数据结构 明确什么类型的题目可以用堆&#xff0c;以及如何用堆来解决 堆的构造和维护过程都非常复杂 1.堆的概念与特征 1.1基本概念 堆&#xff1a;是将一组数据按照 完全二叉树 的存储顺序&#xff0c;将数据存储在一个一…

S32K324芯片学习笔记

文章目录 Core and architectureDMASystem and power managementMemory and memory interfacesClocksSecurity and integrity安全与完整性Safety ISO26262Analog、Timers功能框图内存mapflash Signal MultiplexingPort和MSCR寄存器的mapping Core and architecture 两个Arm Co…

centOS下载与安装

1 下载centOS镜像 The CentOS Project 选择阿里云的镜像 2 下载虚拟机 Vmware workstation VMware - Delivering a Digital Foundation For Businesses 1 下载安装 centOs是一个操作系统&#xff0c;操作硬件的。所以需要有机器&#xff0c;可以使用虚拟机。 2 创建新的虚…

深入理解联邦学习——联邦学习的分类:基础知识

分类目录&#xff1a;《深入理解联邦学习》总目录 在实际中&#xff0c;孤岛数据具有不同分布特点&#xff0c;根据这些特点&#xff0c;我们可以提出相对应的联邦学习方案。下面&#xff0c;我们将以孤岛数据的分布特点为依据对联邦学习进行分类。 考虑有多个数据拥有方&…

利用python制作AI图片优化工具

将模糊图片4K高清化效果如下&#xff1a; 优化前的图片 优化后如下图&#xff1a; 优化后图片变大变清晰了效果很明显 软件界面如下&#xff1a; 所用工具和代码&#xff1a; 1、所需软件包 网盘链接&#xff1a;https://pan.baidu.com/s/1CMvn4Y7edDTR4COfu4FviA提取码&…

【SpringMVC】工作流程及入门案例

目录 前言 回顾MVC三层架构 1. SpringMVC简介 …

《智能网联汽车自动驾驶功能测试规程》

一、 编制背景 2018 年4 月12 日&#xff0c;工业和信息化部、公安部、交通运输部联合发布《智能网联汽车道路测试管理规范(试行)》&#xff08;以下简称《管理规范》&#xff09;&#xff0c;对智能网联汽车道路测试申请、审核、管理以及测试主体、测试驾驶人和测试车辆要求等…

船舶稳定性和静水力计算——绘图体平面图,静水力,GZ计算(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Qt鼠标点击事件处理:显示鼠标点击位置(完整示例)

Qt 入门实战教程&#xff08;目录&#xff09; 前驱文章&#xff1a; Qt Creator 创建 Qt 默认窗口程序&#xff08;推荐&#xff09; 什么是事件 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。 事件&#xff08;event&#xff09;驱动…

RHCA之路---EX280(4)

RHCA之路—EX280(4) 1. 题目 Use the S2I functionality of your OpenShift instance to build an application in the rome project Use the Git repository at http://services.lab.example.com/php-helloworld for the application source Use the Docker image labeled re…

java八股文面试[数据库]——mysql主从复制

什么是mysql的主从复制&#xff1f; MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式&#xff0c;这样从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0c;从节点…

【Spring Boot】使用MyBatis注解实现数据库操作

使用MyBatis注解实现数据库操作 MyBatis还提供了注解的方式&#xff0c;相比XML的方式&#xff0c;注解的方式更加简单方便&#xff0c;无须创建XML配置文件。接下来好好研究注解的使用方式。 1.XML和注解的异同 1&#xff09;注解模式使用简单&#xff0c;开发效率高&#…

【SpringSecurity】十一、SpringSecurity集成JWT实现token的方法与校验

文章目录 1、依赖与配置2、JWT工具类3、认证成功处理器4、创建JWT过滤器5、安全配置类 1、依赖与配置 添加JWT的maven依赖&#xff1a; <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId…

NC后端扩展开发

前言 在日常的工作中&#xff0c;会遇到各种各样的需要进行扩展开发的需求&#xff0c;可以使用系统预留的扩展开发机制来实现&#xff0c;避免修改源码。因NC产品已迭代至BIP版本&#xff0c;所以前端扩展方式就再进行不赘述了&#xff0c;本文主要介绍后端扩展开发方式&…

sentinel blockHandler不生效

sentinel blockHandler不生效: package org.bc.sentinel.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.apache.commons.lang3.RandomUtils; import org.springfram…

LeetCode 47题:全排列2

题目 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[…

机器学习---预剪枝、后剪枝(REP、CCP、PEP、)

1. 为什么要进行剪枝 横轴表示在决策树创建过程中树的结点总数&#xff0c;纵轴表示决策树的预测精度。 实线显示的是决策树 在训练集上的精度&#xff0c;虚线显示的则是在⼀个独⽴的测试集上测量出来的精度。 随着树的增⻓&#xff0c;在 训练样集上的精度是单调上升的&…