一、前言

1.1 功能特点

  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等)。

1.2 使用步骤

  1. 选择或者填写推流的前缀地址,建议默认即可。
  2. 单击添加文件或者目录,选择要加入推流的音视频文件,添加成功以后会自动罗列在表格中。
  3. 单击添加地址,可以从下拉框中选择或者填写,下拉选项中是一些格式模板,比如本地摄像头、本地桌面、电视台、网络摄像机等。
  4. 单击启动服务按钮,会变成停止服务字样表示启动服务成功。
  5. 在启动服务后支持动态添加地址、移除地址、清空地址。如果处于启动服务中,添加后会立即推流。
  6. 从表格中选中一行,会自动将播放地址填写到右下角,同时也会自动拷贝到剪切板。
  7. 一次推流可以分多种不同的地址访问,右下角总共有四种地址,第一种是rtsp开头的视频流地址,可以用各种播放器打开;第二种是rtmp开头的视频流地址,可以用各种播放器打开;第三种是hls(m3u8)格式的地址,一般用于网页浏览器显示;第四种是webrtc格式的地址,一般用于浏览器或者部分支持该格式的播放器。
  8. 将地址粘贴到浏览器地址栏回车即可查看视频流,地址也可以用播放器打开。
  9. 单击停止服务按钮会停止所有服务,在启动服务后支持动态添加文件、移除文件、清空文件。
  10. 在添加的时候可以手动填写唯一标识(obs中的推流码,其实就是推流地址后的一串字符,很多流媒体服务会规定一个地址给你推流),没有填写则按照规则自动生成(切记这个唯一标识推流码一定要在添加前写好,他是在添加的时候设置进去的)。
  11. 可以在表格中选中某行,实时预览对应的推流的画面,如果是文件,会自动显示对应的播放进度和总时长,可以切换进度条拉动播放进度,推流那边也会自动切换到当前的进度画面。
  12. 如果选择的是rtmp推流地址,则H265格式会自动转换成H264的格式推流,rtsp推流地址直接支持H265格式视频数据。
  13. 默认hls/m3u8地址提供的是直接网页浏览器地址栏输入可以直接打开播放的,如果想要播放器直接播放的那种,格式在原来的地址后面加上 /index.m3u8,比如 http://127.0.0.1:8888/test/index.m3u8 。播放器播放hls地址延迟很大,可能在10s左右,不推荐用这个地址,推荐网页用webrtc,播放器用rtsp。

1.3 格式说明

  1. 本地摄像头推流,video=USB Video Device|1280x720|25,video=是固定前缀,USB Video Device是摄像头的英文名字,可以在设备管理器中鼠标右键查看,1280x720表示分辨率,25表示采集帧率,不填写分辨率默认按照640x480,不填写帧率默认按照25。
  2. 本地桌面推流,desktop=desktop|800x600|25|0|0,desktop=是固定前缀,后面的desktop表示桌面,800x600是分辨率,25是帧率,后面的0|0表示开始的坐标XY,形成一个矩形区域实时抓屏推流。不指定分辨率和XY表示当前屏幕整个屏幕。
  3. 多屏幕推流,要推流屏幕1则地址填desktop=desktop||25|0|0|0,要推流屏幕2则地址填desktop=desktop||25|0|0|1,分辨率可以不填,会自动以整个桌面分辨率为准,末尾表示屏幕索引,从0开始。
  4. 指定窗口推流,desktop=title=MainWindow,MainWindow是对应窗口的标题名称,由于窗口名称可能重名,所以未必能找到合适的窗口,而且很多窗体不允许抓图,此方案不推荐。
  5. 指定缩放推流,目前只对桌面推流启用,desktop=desktop|800x600|25|0|0|-1|0.5 表示缩放50%推流,desktop=desktop|1920x1080|25|0|0|-1|640x480 表示按照640x480分辨率缩放推流,建议设置缩放百分比,这样等比例缩放。
  6. 桌面推流如果采集的分辨率过大,建议降低帧率以便减少CPU占用,比如设置成10即可,尤其是1080P以上的屏幕。
  7. 桌面推流可以添加多个不同分辨率推流,可以按照自己需要的分辨率拉流。
  8. 视频流地址后面加上|tcp表示采用tcp协议通信,比如rtsp://192.168.0.108|tcp。
  9. 详细格式说明参见 https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/#07-视频格式

1.4 代码使用

  1. 将pri组件拷贝到你的项目下,pro中加一行引入推流组件include ($$PWD/../core_videopush/core_videopush.pri)。
  2. 如果是网络推流则还需要引入ffmpeg等视频组件,参见提供的源码的pro中的写法。
  3. 引入头文件#include "ffmpegpushserver.h"。
  4. 编写代码实现网络推流服务。
//实例化类
FFmpegPushServer *ffmpegPush = new FFmpegPushServer;
//设置推流地址
ffmpegPush->setPushUrl("rtmp://127.0.0.1");
//逐个添加要推流的地址(会返回唯一标识用于拉流/也可以指定唯一标识)
ffmpegPush->addUrl("f:/1.mp4", "test1");
ffmpegPush->addUrl("video=USB Video Device|1280x720|25", "test2");
ffmpegPush->addUrl("desktop=desktop|800x600|25|0|0", "test3");
ffmpegPush->addUrl("http://vfx.mtime.cn/Video/2021/11/16/mp4/211116131456748178.mp4", "test4");
ffmpegPush->addUrl("rtsp://admin:Admin123456@192.168.0.64:554/Streaming/Channels/101", "test5");
//获取拉流地址(该地址是rtmp拉流地址/可以用播放器播放)
QString url = ffmpegPush->getPushUrl("f:/1.mp4");
//启动推流服务
ffmpegPush->start();
//结束的时候停止
ffmpegPush->stop();

二、效果图

















三、体验地址

  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。

Qt/C++原创推流工具/支持多种流媒体服务/ZLMediaKit/srs/mediamtx等的更多相关文章

  1. 文档资源搜索小工具 - 支持PDF,DOC,PPT,XLS

    最近做了一个文档搜索小工具,当然不是网盘搜索工具,这个工具支持四种文件格式搜索(pdf,doc,ppt,xls),你只需要在搜索框中输入你想要搜索资源的关键词,点击搜索按钮即可获取相关资源,点击下载按 ...

  2. 3-WIN10系统及开发工具支持

    本篇博客对应视频讲解 回顾 上一讲说了编程的方向和技术流派以及选择入门语言的建议.当我们决定我们的选择之后呢,我们就要学习和进行实践操作了.但在实践之前,我们仍然需要做好相应的准备,这也就是今天要讲的 ...

  3. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. [原创]K8飞刀20150720 新增Shellcode Loader支持多种格式

    工具: K8飞刀编译: 自己查壳组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 2015/7/20 3:00:18 简介: ...

  5. 【原创】C++链表如何像Python List一样支持多种数据类型

    用过Python的码友都知道,Python中List支持多种数据类型,如下面代码所示链表li内的数据类型可以是整数,同时也可以是字符串,当然也可以是其他数据类型. 1: >>> li ...

  6. QCryptographicHash实现哈希值计算,支持多种算法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QCryptographicHash实现哈希值计算,支持多种算法     本文地址:http: ...

  7. OBS桌面视频直播软件/推流工具使用指南

    OBS 操作指南 什么是OBS? Open Broadcaster Software 是一款好用的互联网流媒体直播内容输入作软件. OBS使用是否收费? 不收费,这个程序和它的源代码都是免费的. OB ...

  8. [原创]RedisDesktopManager工具使用介绍

    [原创]RedisDesktopManager工具使用介绍 1 RedisDesktopManager简介 一款能够跨平台使用的开源性redis可视化工具.redis desktop manager主 ...

  9. QT中文乱码与国际化支持

      QT国际化支持 Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性.Qt本身提供的linguist工具,用来实现翻译过程十分方便.MFC中利用资源DLL切换资源,或 ...

  10. Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

    目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...

随机推荐

  1. 74.数组map能干什么,会改变原数组吗

    map是处理数据的方法,不会改变原数组,会返回一个新数组 : filter 也不会改变原数组,会返回新数组 : forEach 也不会改变原数组,不会返回新数组 : reduce不会改变原数组 : 是 ...

  2. 无需等待Vue Release发布,就能在项目中体验最新版

    前言 两个月前尤大在Vue 仓库中引入了 pkg.pr.new,有了这个后Vue仓库中的每个commit或者PR都会自动触发一个新的发布,我们就可以在项目中体验最新版本的Vue啦. 关注公众号:[前端 ...

  3. 如何在Spark键值对数据中,对指定的Key进行输出/筛选/模式匹配

    在用键值对RDD进行操作时,经常会遇到不知道如何筛选出想要数据的情况,这里提供了一些解决方法 目录 1.对固定的Key数据进行查询 2.对不固定的Key数据进行模糊查询 1.对固定的Key数据进行查询 ...

  4. P9119 [春季测试 2023] 圣诞树

    参考博客: 春季测试 2023] 圣诞树 题解 - 洛谷专栏 (luogu.com.cn) 题意:给定二维平面上一个凸多边形的 \(n\) 个顶点, 求一种方案,使得从最高点开始,不重复地经过所有点后 ...

  5. 3.18 Linux懒人神器:命令自动补全功能!

    文件名(或者目录名)是执行 linux 命令中最常见的参数,例如前面介绍的 cd.mkdir.cp 等命令,都涉及到了文件名.然而对初学者来说,输入完整的文件名感觉很麻烦,尤其面临文件名(目录名)特别 ...

  6. Python 潮流周刊#77:Python 依赖管理就像垃圾场火灾?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  7. CodeForces - 1353D Constructing the Array

    CodeForces - 1353D 这道题也可能比较简单,主要是要想到优先队列要怎么使用,这一点如果用递归会写不了 但是因为对优先队列不太熟悉,只有被提示可以用优先队列才想到要怎么用, 还是很重要的 ...

  8. Redis未授权漏洞复现

    目录 Redis 漏洞的产生条件及利用 Redis环境搭建 漏洞复现 利用Redis写入Webshell 利用Redis写入SSH公钥 利用Redis写入计划任务 Redis安全防护 Redis re ...

  9. WSL2 使用 code . 命令打开文件夹时,出现 "Unable to establish SSL connection. ERROR: Failed to download..."

    1. 背景 在 wsl2 里开发一个小项目,之前一直使用功能正常. 今天按以往的流程(打开 wsl2(ubuntu) 终端,进入到指定文件夹目录下,输入 code . 命令,在 vscode 中打开该 ...

  10. BI系统汇总

    datart datart (数艺)是面向业务人员.数据工程师.数据分析师.数据科学家,致力于提供一站式数据可视化解决方案.既可以作为公 有云 / 私有云部署使用,也可作为可视化插件集成到三方系统.用 ...