• 50阅读
  • 0回复

工匠精神/Qt同时推流和录制16路1080p/CPU占用不到1%/实时性好/极低资源占用/优化到极致 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 昨天 10:28


## 一、前言说明
光一个推流组件就写了很多年,不是工匠精神是什么?谁说写程序不需要工匠精神的,没有工匠精神就做不出一个好用的程序。搞程序开发这么多年,明白一个道理,为了能快速获取用户,首先要快速迭代出来一个基本可用的版本发布,就是满足基本功能,然后推出来看下用户的反应,受欢迎的功能点可以持续继续迭代,不欢迎的功能,或者几百年用不上的功能,考虑直接去掉,或者默认配置关闭,用户需要再自行开启。

用Qt结合ffmpeg做推流,最开始都是先采集解码再推流,发现挺占CPU的,毕竟解码这块费CPU,哪怕是硬解,也是费一定的CPU,而且路数多了的话,比如64路同时拉流推流,如果都去解码后再推流,资源占用极高,没有一个好配置的电脑可能都撑不住,那怎么办,发现人家很多NVR配置很低的,但是依然能支撑至少16路的同时保存,除了用了专有的硬件外,应该是有其他机制,查阅资料后发现,越来只要是264/265流数据,可以不用解码直接保存或者推流,这样就几乎不用占用任何CPU,哪怕是16路也是0%的占用,我去这不正是我们想要的结果吗?于是在之前的ffmpeg采集解码线程增加了标志位,专门用来控制是否需要去解码,如果要显示当前采集线程的画面,就需要解码,否则不需要。

光推流还不能体现优化到极致,如果再加上推流的同时保存文件到本地呢,这下压力就很大了吧,有些做法是再去拉流保存,这大可不必,毕竟推流这边的拉流线程已经拉到了,完全可以复用数据,其实就是收到的packet数据再次保存即可,所以又在采集线程的基础上,增加了发出packet的信号,以便多路复用数据,自此效果非常完美,16路1080P同时推流和录制,居然占用不到1%的CPU,不要太好。

## 二、效果图




## 三、相关地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 文件地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_push。

## 四、功能特点
1. 支持各种本地音视频文件和网络音视频文件,格式包括mp3、aac、wav、wma、mp4、mkv、rmvb、wmv、mpg、flv、asf等。
2. 支持各种网络音视频流,网络摄像头,协议包括rtsp、rtmp、http等。
3. 支持本地摄像头设备推流,可指定分辨率、帧率、格式等。
4. 支持本地桌面采集推流,可指定屏幕索引、采集区域、起始坐标、帧率等,也支持指定窗口标题进行采集。
5. 可实时切换预览视频文件,可切换音视频文件播放进度,切换到哪里就推流到哪里。预览过程中可以切换静音状态和暂停推流。
6. 可指定重新编码推流,任意源头格式可选强转264或265格式。
7. 可转换分辨率推流,设置等比例缩放或者指定分辨率进行转换。
8. 推流的清晰度、质量、码率都可调,可以节约网络带宽和拉流端的压力。
9. 音视频文件自动循环不间断推流。
10. 音视频流有自动掉线重连机制,重连成功自动继续推流。
11. 支持各种流媒体服务程序,包括但不限于mediamtx、ZLMediaKit、srs、LiveQing、nginx-rtmp、EasyDarwin、ABLMediaServer。
12. 通过配置文件自动加载对应流媒体程序的协议和端口,自动生成推流地址和各种协议的拉流地址。可以通过配置文件自己增加流媒体程序。
13. 可选rtmp、rtmp格式推流,推流成功后,支持多种格式拉流,包括但不限于rtsp、rtmp、hls、flv、ws-flv、webrtc等。
14. 在软件上推流成功后,可以直接单击网页预览,实时预览推流后拉流的画面,多画面网页展示。
15. 软件界面上可单击对应按钮,动态添加文件和目录,可手动输入地址。
16. 推拉流实时性极高,延迟极低,延迟时间大概在100ms左右。
17. 极低CPU资源占用,4路主码流推流只需要占用0.2%CPU。理论上常规普通PC机器推100路毫无压力,主要性能瓶颈在网络。
18. 可以推流到外网服务器,然后通过手机、电脑、平板等设备播放对应的视频流。
19. 每路推流都可以手动指定唯一标识符(方便拉流/用户无需记忆复杂的地址),没有指定则按照策略随机生成hash值。也支持自动按照指定标识后面加数字的方式递增命名。比如设置标识为字母v,策略为标识递增,则每添加一个对应的推流码命名依次是v1、v2、v3等。
20. 根据推流协议自动转码格式,默认策略按照选择的推流协议,比如rtsp支持265而rtmp不支持,如果是265的文件而选择rtmp推流,则自动转码成264格式再推流。
21. 音视频同步推流,在拉流和采集的时候就会自动处理好同步,同步后的数据再推流。
22. 表格中实时显示每一路推流的分辨率和音视频数据状态,灰色表示没有输入流,黑色表示没有输出流,绿色表示原数据推流,红色表示转码后的数据推流。
23. 自动重连视频源,自动重连流媒体服务器,保证启动后,推流地址和打开地址都实时重连,只要恢复后立即连上继续采集和推流。
24. 根据不同的流媒体服务器类型,自动生成对应的rtsp、rtmp、hls、flv、ws-flv、webrtc拉流地址,用户可以直接复制该地址到播放器或者网页中预览查看。
25. 添加的推流地址等信息自动存储到文件,可以手动打开进行修改,默认启动后自动加载历史记录。
26. 可以指定生成的网页文件保存位置,方便作为网站网页发布,可以直接在浏览器中输入网址进行访问,发布后可以直接在局域网其他设备比如手机或者电脑打开对应网址访问。
27. 可选是否开机启动、后台运行等。网络推流添加的rtsp地址可勾选是否隐藏地址中的用户信息。
28. 自带设备推流模块,自动识别本地设备,包括本地的摄像头和桌面,可以手动选择不同的是视频和音频采集设备进行推流。
29. 自带文件点播模块,添加文件后用户可以拉取地址点播,用户端可以任意切换播放进度。支持各种浏览器(谷歌chromium、微软edge、火狐firefox等)、各种播放器(vlc、mpv、ffplay、potplayer、mpchc等)打开请求。
30. 文件点播模块实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。
31. 文件点播模块采用纯QTcpSocket通信,不依赖流媒体服务程序,核心源码不到500行,注释详细,功能完整。
32. 支持任意Qt版本(Qt4、Qt5、Qt6),支持任意系统(windows、linux、macos、android、嵌入式linux等)。

## 五、相关代码
1. 将pri组件拷贝到你的项目下,pro中加一行引入推流组件include ($$PWD/../core_videopush/core_videopush.pri)。
2. 如果是网络推流则还需要引入ffmpeg等视频组件,参见提供的源码的pro中的写法。
3. 引入头文件#include "netpushserver.h"。
4. 编写代码实现网络推流服务。
```cpp
//实例化类
NetPushServer *pushServer = new NetPushServer;
//设置推流地址
pushServer->setPushUrl("rtmp://127.0.0.1");
//逐个添加要推流的地址(会返回唯一标识用于拉流/也可以指定唯一标识)
pushServer->addUrl("f:/1.mp4", "test1");
pushServer->addUrl("video=USB Video Device|1280x720|25", "test2");
pushServer->addUrl("screen=desktop|800x600|25|0|0", "test3");
pushServer->addUrl("http://vfx.mtime.cn/Video/2021/11/16/mp4/211116131456748178.mp4", "test4");
pushServer->addUrl("rtsp://admin:Admin123456@192.168.0.64:554/Streaming/Channels/101", "test5");
//获取拉流地址(该地址是rtmp拉流地址/可以用播放器播放)
QString url = pushServer->getPushUrl("f:/1.mp4");
//启动推流服务
pushServer->start();
//结束的时候停止
pushServer->stop();
```
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个