一、前言
1.1 功能特点
- 支持各种本地视频文件和网络视频文件。
- 支持各种网络视频流,网络摄像头,协议包括rtsp、rtmp、http。
- 支持将本地摄像头设备推流,可指定分辨率和帧率等。
- 支持将本地桌面推流,可指定屏幕区域和帧率等。
- 自动启动流媒体服务程序,默认mediamtx(原rtsp-simple-server),可选用srs、EasyDarwin、LiveQing、ZLMediaKit等。
- 可实时切换预览视频文件,可切换视频文件播放进度,切换到哪里就推流到哪里。
- 推流的清晰度和质量可调。
- 可动态添加文件、目录、地址。
- 视频文件自动循环推流,如果视频源是视频流,在掉线后会自动重连。
- 网络视频流自动重连,重连成功自动继续推流。
- 网络视频流实时性极高,延迟极低,延迟时间大概在100ms左右。
- 极低CPU占用,4路主码流推流只需要占用0.2%CPU。理论上常规普通PC机器推100路毫无压力,主要性能瓶颈在网络。
- 推流可选推流到rtsp/rtmp两种,推流后的数据支持直接rtsp/rtmp/hls/webrtc四种方式访问,可以直接浏览器打开看实时画面。
- 可以推流到外网服务器,然后通过手机、电脑、平板等设备播放对应的视频流。
- 每个推流都可以手动指定唯一标识符(方便拉流/用户无需记忆复杂的地址),没有指定则按照策略随机生成hash值。
- 自动生成测试网页直接打开播放,可以看到实时效果,自动按照数量对应宫格显示。
- 推流过程中可以在表格中切换对应推流项,实时预览正在推流的视频,并可以切换视频文件的播放进度。
- 音视频同步推流,符合264/265/aac格式的自动原数据推流,不符合的自动转码再推流(会占用一定CPU)。
- 转码策略支持三种,自动处理(符合要求的原数据/不符合的转码),仅限文件(文件类型的转码视频),所有转码。
- 表格中实时显示每一路推流的分辨率和音视频数据状态,灰色表示没有输入流,黑色表示没有输出流,绿色表示原数据推流,红色表示转码后的数据推流。
- 自动重连视频源,自动重连流媒体服务器,保证启动后,推流地址和打开地址都实时重连,只要恢复后立即连上继续采集和推流。
- 提供循环推流示例,一个视频源同时推流到多个流媒体服务器,比如打开一个视频同时推流到抖音/快手/B站等,可以作为录播推流,列表循环,非常方便实用。
- 根据不同的流媒体服务器类型,自动生成对应的rtsp/rtmp/hls/flv/ws-flv/webrtc地址,用户可以直接复制该地址到播放器或者网页中预览查看。
- 编码视频格式可以选择自动处理(源头是264就264/源头是265就265),转H264(强制转264),转H265(强制转265)。
- 支持Qt4/Qt5/Qt6任意版本,支持任意系统(windows/linux/macos/android/嵌入式linux等)。
1.2 使用步骤
- 选择或者填写推流的前缀地址,建议默认即可。
- 单击添加文件或者目录,选择要加入推流的音视频文件,添加成功以后会自动罗列在表格中。
- 单击添加地址,可以从下拉框中选择或者填写,下拉选项中是一些格式模板,比如本地摄像头、本地桌面、电视台、网络摄像机等。
- 单击启动服务按钮,会变成停止服务字样表示启动服务成功。
- 在启动服务后支持动态添加地址、移除地址、清空地址。如果处于启动服务中,添加后会立即推流。
- 从表格中选中一行,会自动将播放地址填写到右下角,同时也会自动拷贝到剪切板。
- 一次推流可以分多种不同的地址访问,右下角总共有四种地址,第一种是rtsp开头的视频流地址,可以用各种播放器打开;第二种是rtmp开头的视频流地址,可以用各种播放器打开;第三种是hls(m3u8)格式的地址,一般用于网页浏览器显示;第四种是webrtc格式的地址,一般用于浏览器或者部分支持该格式的播放器。
- 将地址粘贴到浏览器地址栏回车即可查看视频流,地址也可以用播放器打开。
- 单击停止服务按钮会停止所有服务,在启动服务后支持动态添加文件、移除文件、清空文件。
- 在添加的时候可以手动填写唯一标识(obs中的推流码,其实就是推流地址后的一串字符,很多流媒体服务会规定一个地址给你推流),没有填写则按照规则自动生成(切记这个唯一标识推流码一定要在添加前写好,他是在添加的时候设置进去的)。
- 可以在表格中选中某行,实时预览对应的推流的画面,如果是文件,会自动显示对应的播放进度和总时长,可以切换进度条拉动播放进度,推流那边也会自动切换到当前的进度画面。
- 如果选择的是rtmp推流地址,则H265格式会自动转换成H264的格式推流,rtsp推流地址直接支持H265格式视频数据。
- 默认hls/m3u8地址提供的是直接网页浏览器地址栏输入可以直接打开播放的,如果想要播放器直接播放的那种,格式在原来的地址后面加上 /index.m3u8,比如 http://127.0.0.1:8888/test/index.m3u8 。播放器播放hls地址延迟很大,可能在10s左右,不推荐用这个地址,推荐网页用webrtc,播放器用rtsp。
1.3 格式说明
- 本地摄像头推流,video=USB Video Device|1280x720|25,video=是固定前缀,USB Video Device是摄像头的英文名字,可以在设备管理器中鼠标右键查看,1280x720表示分辨率,25表示采集帧率,不填写分辨率默认按照640x480,不填写帧率默认按照25。
- 本地桌面推流,desktop=desktop|800x600|25|0|0,desktop=是固定前缀,后面的desktop表示桌面,800x600是分辨率,25是帧率,后面的0|0表示开始的坐标XY,形成一个矩形区域实时抓屏推流。不指定分辨率和XY表示当前屏幕整个屏幕。
- 多屏幕推流,要推流屏幕1则地址填desktop=desktop||25|0|0|0,要推流屏幕2则地址填desktop=desktop||25|0|0|1,分辨率可以不填,会自动以整个桌面分辨率为准,末尾表示屏幕索引,从0开始。
- 指定窗口推流,desktop=title=MainWindow,MainWindow是对应窗口的标题名称,由于窗口名称可能重名,所以未必能找到合适的窗口,而且很多窗体不允许抓图,此方案不推荐。
- 指定缩放推流,目前只对桌面推流启用,desktop=desktop|800x600|25|0|0|-1|0.5 表示缩放50%推流,desktop=desktop|1920x1080|25|0|0|-1|640x480 表示按照640x480分辨率缩放推流,建议设置缩放百分比,这样等比例缩放。
- 桌面推流如果采集的分辨率过大,建议降低帧率以便减少CPU占用,比如设置成10即可,尤其是1080P以上的屏幕。
- 桌面推流可以添加多个不同分辨率推流,可以按照自己需要的分辨率拉流。
- 视频流地址后面加上|tcp表示采用tcp协议通信,比如rtsp://192.168.0.108|tcp。
- 详细格式说明参见 https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/#07-视频格式
1.4 代码使用
- 将pri组件拷贝到你的项目下,pro中加一行引入推流组件include ($$PWD/…/core_videopush/core_videopush.pri)。
- 如果是网络推流则还需要引入ffmpeg等视频组件,参见提供的源码的pro中的写法。
- 引入头文件#include “ffmpegpushserver.h”。
- 编写代码实现网络推流服务。
//实例化类
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();
二、效果图
三、体验地址
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_push。