2.1 网络推流
公众号:Qt实战,各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。
公众号:Qt入门和进阶,专门介绍Qt/C++相关知识点学习,帮助Qt开发者更好的深入学习Qt。多位Qt元婴期大神,一步步带你从入门到进阶,走上财务自由之路。
2.1.1 操作步骤
- 第一步:选择流媒体服务程序的类型,比如mediamtx。
- 第二步:选择推流模式,可选rtsp/rtmp,要看具体流媒体程序支持哪种,大部分都同时支持两种。
- 第三步:选择网卡,从网卡地址下拉框中选择要推流的网卡地址,可能一台电脑设置了多个IP地址,所以要选择对应的网卡地址。这个关系到拉流的时候对应地址从哪里拉。
- 第四步:选择类型和模式后,会自动生成对应的推流地址,也可以手动修改,比如如果需要udp推流可以在推流地址框中输入udp://127.0.0.1:8888。
- 第五步:添加好要推流的文件或者地址,可以单选选择文件、目录、地址三种方式添加。添加完成后会自动在左侧表格中显示。
- 第六步:单击启动服务,开始推流。如果推流成功,左侧表格中每一个推流行会显示推流中字样。
- 第七步:推流成功后,可以单击选中表格行,右下角会自动显示多种拉流地址,其中rtsp、rtmp这种用播放器可以直接打开,http这种可能需要直接浏览器中打开。
- 第八步:网页预览,这一步可选,只是为了验证推流后的音视频在网页中能否正常播放。
2.1.2 其他说明
- 流媒体服务程序类型和端口相关信息在配置文件config/video_push_port.txt文件中,可以自行修改。端口信息务必正确,不然自动生成的推流和拉流地址端口不正确,导致推拉流失败。由于一台电脑可能安装了多个流媒体服务程序,为了方便测试,或者端口有冲突(比如windows上rtsp的554端口很可能被占用/需要改成其他端口比如5541),会将部分程序的端口设置成其他端口,最终以修改后的真实端口为准。
- 选择rtsp/rtmp其中一种模式推流后,可以用不同方式拉流,比如rtsp、rtmp、hls、flv、ws-flv、webrtc。并不是说要用rtsp拉流就必须rtsp推流,流媒体服务程序专门负责转换,会自动根据请求的协议转换对应的格式数据推给拉流者。
- udp推拉流端口是唯一的,意味着一个端口只能用于一个推流对象,而且端口是独占的,拉流那边只能一个地方拉。
- 添加文件、目录、地址,可以在启动服务前添加好,也可以在启动服务后添加,都会自动处理。
- 默认的生成唯一标识策略是标识递增,即以指定的标识后面添加数字序号来命名。可以在其他参数中修改,比如需要手动指定唯一的标识(类似于OBS中的推流码,其实就是推流地址后的一串字符,很多流媒体服务会规定一个地址给你推流),可以在策略下拉框选择指定标识,此时再去添加,则按照输入框的指定标识来添加。切记唯一标识不能重复。
- 在表格中选中一行后,会自动显示该对象的视频预览画面和播放进度,可以拖动播放进度切换推流进度。
- 如果选择的是rtmp推流地址,则H265格式会自动转换成H264的格式推流,rtsp推流地址直接支持H265格式视频数据。
- webrtc不支持265视频和aac音频格式,如果想要在网页中的webrtc方式打开视频听到声音,需要源头是264+pcma/pcmu格式的数据,建议用rtsp方式推流。一般监控厂家的设备都支持调整视音频格式。
- 不仅支持音视频文件和流,还支持本地设备比如摄像头和桌面采集推流,格式超级详细,你想要的各种可能的情况和需求场景几乎都涵盖,经过了多少年的实战总结和验证。具体详细格式说明参见 https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/#07-地址格式
- 为什么放一个静音复选框?因为很多时候测试都是在同一台电脑,为了验证音频是否也同步推流成功,需要推流这边静音播放,这样拉流那边出来的声音就是拉流的,可以验证音频是否推流成功以及是否音视频同步。这样就不会有声音干扰。
- 如果想要降低带宽,可以在其他参数中选择强转265,或者还可以选择降低图片质量,以及缩放分辨率,比如设置50%则按照原有分辨率的一半宽高缩放再推流。
- 预览类型,可选hls、flv、ws-flv、webrtc,不同的流媒体服务器支持的预览类型不同,实时性推荐webrtc和ws-flv。flv最多可以在一个网页中同时显示6个,这是浏览器的限制。
- 如果在win7系统发现mediamtx无法运行,那是因为官方的新版本不再支持win7,可以选择低版本的比如1.3及以下,或者选择其他流媒体程序ZLMediaKit等。
- 不同的流媒体程序有不同的差别和效果,如果想要拉流秒开,建议选用ZLMediaKit。
2.2 设备推流
2.2.1 操作步骤
- 第一步:从下拉框中选择视音频设备,会自动设置对应的采集地址。也可以手动修改采集地址比如指定分辨率和帧率等参数。具体格式要求见网络推流部分的格式说明。
- 第二步:填写推流地址,建议视音频不同推流地址后缀填video/audio字样方便区分。
- 第三步:单击启动推流按钮,推流成功后,视频会显示对应的预览画面,音频显示对应的音柱。
- 第四步:可以打开播放器填入rtsp地址进行验证。
2.2.2 其他说明
- 建议用rtsp推流,因为音频采集到的是pcm数据,rtsp直接支持pcm音频数据推流,不需要转换。
- 默认音视频是分开推流,实时性极好,这样是为了方便各种组合推流,比如桌面采集可以和麦克风组合,也可以和电脑音频组合推流。
- 在windows上支持本地摄像头音视频合并推流。可以在采集地址1中填入video=USB Video Device:audio=麦克风 (USB Audio Device),也就是前面是视频设备字符串,后面是音频设备字符串,中间英文冒号隔开。这样就是合并推流,一路流就带了音视频。
- 如果想在windows上以摄像头设备采集桌面,需要安装screen-capture-recorder。
- 勾选带上水印复选框,会在采集的画面上加上时间水印,方便拉流端查看,不然画面不动可能以为流中断了,有个时间在走就说明是动的画面。
- 桌面推流在配置不够好的电脑上可能遇到光标闪烁的问题,可以注册下screen-capture-recorder.dll即可,找到screen-capture-recorder/screen-capture-recorder注册.cmd 双击运行即可。
2.3 文件点播
2.3.1 操作步骤
- 第一步:选择或者填写要监听的网卡IP地址,填写好监听端口,建议默认即可。
- 第二步:单击添加文件或者目录,选择要加入点播的音视频文件,添加成功以后会自动罗列在表格中。
- 第三步:单击启动服务按钮,启动成功会变成停止服务。
- 第四步:验证点播地址,从表格中选中一行,会自动将该音视频文件的播放地址填写到右下角。将地址粘贴到浏览器地址栏回车即可查看播放音视频,可以任意切换播放进度。将地址用vlc或者其他播放器打开即可查看播放音视频,可以任意切换播放进度。
2.3.2 其他说明
- 文件点播服务支持多个同时请求,表格中会显示每个文件对应正在请求中的数量。
- 右下角有统计总请求数量,还有统计不同IP地址的请求总数。
- 单击停止服务按钮会停止所有服务,由于存在缓存的关系,停止以后缓存中的视频还可以继续播放,过一段时间就不能播放。
- 在启动服务后支持动态添加文件、移除文件、清空文件。
- 单击网页预览按钮会自动生成网页文件并打开预览。
2.4 系统设置
2.4.1 基本设置
- 软件标题:默认为空,会自动生成一个带版本号的标题,可以手动填写。
- GPU模式:有些电脑可能opengl版本过低或者不兼容,需要从下拉框选择opengles模式。
- 禁止多开:开启后软件只能运行一个实例,不允许多开,防止重复推流导致推流失败,因为一个推流码只能接收一个地方推流,否则数据冲突会失败。
- 开机运行:默认关闭,开机运行功能需要管理员身份运行程序才能正确设置开启启动,运行过一次就行。
- 后台运行:默认关闭,开启后在窗口最小化的时候,自动隐藏到右下角托盘运行,双击托盘图标或者右键选择主界面可以打开主界面。会自动记住最后是后台托盘运行还是显示的主界面运行,下次打开自动应用最后的配置。
- 自动复制:开启后选中表格行后,会自动拷贝第一个地址到剪切板,这样选中后就无须再去复制地址,而是直接到浏览器或者播放器粘贴地址播放即可。
- 外网地址:如果程序放在云服务器上运行,一般需要监听的网卡是内网的网卡,而对外访问是通过外网地址访问的,所以存在一个问题,就是自动生成的地址是以选择的网卡地址为准的。而实际需要的是能够直接访问的地址,所以需要用这个外网地址替换掉内网地址,用于生成正确的拉流地址。
- 网页地址:当网页预览文件生成的地址在www网站目录,则用这个网络地址来打开。
- 网络推流,网络推流模块网页预览文件存放地址。
- 文件点播,文件点播模块网页预览文件存放地址。
2.4.2 模块启用
勾选对应的模块,重启后会显示对应的模块在主界面中,重启应用。这个功能主要是为了方便有些用户希望简单点,不需要的模块就不要在界面上显示。
2.5 代码使用
- 将pri组件拷贝到你的项目下,pro中加一行引入推流组件include ($$PWD/…/core_videopush/core_videopush.pri)。
- 如果是网络推流则还需要引入ffmpeg等视频组件,参见提供的源码的pro中的写法。
- 引入头文件#include “netpushserver.h”。
- 编写代码实现网络推流服务。
//实例化类
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("desktop=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();
2.6 流媒体服务
- 本程序支持各种流媒体服务程序比如mediamtx、LiveQing、EasyDarwin、ZLMediaKit,srs等,只要填写好对应的推流码即可。
- 每种流媒体都对应有自己的拉流格式和默认端口,该信息可以在配置文件config/video_push_port.txt中修改。
- 端口信息非常重要,必须和流媒体服务器要求的格式完全一致,否则自动生成的网页预览以及右下角生成的各种拉流地址可能不正确。
- 默认端口rtsp是554、rtmp是1935、http是80,所有默认端口可以不填。比如rtsp://127.0.0.1:554/live可以省略成rtsp://127.0.0.1/live。
- 大量测试下来,网页显示视频流实时性从高到低依次是 webrtc > ws-flv > flv > hls。播放器打开rtsp/rtmp视频流实时性由具体的播放器控制,比如缓存大小和缓存时间,是否音视频同步等。
- 由于flv拉流同源地址最大支持6路同时播放,所以要想实时性高而且网页播放支持多路就选择ws-flv,hls实时性最差。
- mediamtx推出来的hls/webrtc流可以直接地址复制到浏览器打开,不依赖额外的js播放器播放。
- windows系统上554端口可能被系统服务占用,建议修改成其他端口比如5541。
- 如果有其他流媒体服务程序需要加入支持,直接在config/video_push_port.txt中增加即可,对应拉流地址格式需要在程序代码中加几行。
- 预览文件生成位置可以设置到www网站目录,这样预览后可以直接通过网址或者IP地址打开,局域网也可以访问。
- 各种流媒体服务器对接使用视频 https://www.bilibili.com/video/BV1rj411W7uB
- 不同系统流媒体服务器使用视频 https://www.bilibili.com/video/BV14P411x7rF