不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以qq、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。
除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用webrtc技术,有关webrtc的编程开发及其项目实战参见《android studio开发实战:从零基础到app上线(第3版)》一书的第20章“20.2 给app集成webrtc”。
书的第20章“20.2 给app集成webrtc”但是一对多的在线直播采用webrtc技术就不太合适了,因为webrtc只管打洞把双方的网络打通,不考虑综合负载。一旦连接webrtc的设备多起来,整个webrtc网络就会瘫痪。那么一对多的在线直播就要考虑部署独立的流媒体服务器,通过专门的流媒体传输协议,处理媒体源的音视频格式转换,以及音频流和视频流的数据分发工作。更多详细的ffmpeg开发知识参见《ffmpeg开发实战:从零基础到短视频上线》一书。
一、常见的四种流媒体传输协议对比
常见的流媒体传输协议主要有下面几类:
- rtsp协议:网络延迟很低,且支持倍速播放功能。但客户端的对该协议支持很弱,不仅ios不支持播放rtsp流,连大多数浏览器也不能直接播放rtsp流。而且rtsp对服务端的复杂度要求比较高,以至流媒体服务器srs干脆放弃支持rtsp协议,直播录制软件obs studio也没支持该协议。目前rtsp主要应用于对实时性要求高的安防监控领域。
- rtmp协议:网络延迟较低,稳定性很高,即使网络连接质量欠佳,该协议也能很好地传输数据。但rtmp原本因flv格式而生,客户端要用flash播放器播放rtmp链接。而flv格式后来没落了,以至html5规范干脆移除了flash插件,导致如今浏览器都不支持rtmp链接,连ffmpeg也迟至6.1版才给rtmp协议支持hevc格式。不过好在rtmp的稳定性高,服务端的实现相对容易,因此被大量应用于网络直播领域。
- srt协议:拥有固定延迟特性,可以抹平网络的抖动,大大降低视频画面的卡顿现象。该协议引入了aes加密算法,无需像rtsp和rtmp那样引入专门的ssl证书。作为较新的流媒体协议,srt支持更多的音视频封装格式。只是该协议的支持库libsrt在2017年才开源,因此未能在移动互联网时代大量铺开,目前主要应用于大型电视直播领域。
- rist协议:该协议同样于2017年提出,与srt协议是竞争关系。rist和srt具有相同的加密级别,都支持大容量流媒体和前向纠错功能。该协议的制定时间比srt还晚,虽然晚制定会多考虑新功能,比如rist支持点到多点广播,而srt不支持;但是晚制定拖累了各开源软件对rist的支持力度,比如obs studio早在25.0开始支持srt,迟至27.0才开始支持rist,另一个直播录制软件rootencoder已支持srt尚未支持rist,流媒体服务器mediamtx已支持srt尚未支持rist。目前rist在国内的应用还很少。
综上所述,虽然rtmp协议不够完善,但胜在出现早,赶上了好时代,现为国内直播领域主流的流媒体协议。下面就以rtmp为例,介绍如何通过obs studio和rtmp streamer向流媒体服务器做rtmp推流。
二、电脑端通过obs studio进行rtmp直播推流
首先启动电脑上的流媒体服务器mediamtx,具体的操作步骤详见《ffmpeg开发实战:从零基础到短视频上线》一书的“10.2 ffmpeg推流和拉流”,也可参考之前的文章《详解mediamtx的推拉流》。
然后启动电脑上的流媒体播放器vlc media player,打开网络串流“rtmp://127.0.0.1:1935/stream”,此时vlc media player的视频播放界面如下图所示。
结合obs studio的直播录制画面和vlc media player的直播观看界面,可知通过obs studio成功实现了rtmp协议的直播功能。
三、手机端通过rtmp streamer进行rtmp直播推流
首先启动云服务上的流媒体服务器srs或者zlmediakit,在云服务器上部署和启动srs或者zlmediakit比较麻烦,三言两语说不清楚。如果大家想弄明白如何在云服务器上操作srs或者zlmediakit,可在京东自营购买《ffmpeg开发实战:从零基础到短视频上线》一书,联系作者咨询这两个流媒体服务器在云服务器上的详细运行过程。
接着启动手机上的直播录制软件rtmp streamer,具体的操作步骤详见之前的文章《使用rtmp streamer开启app直播推流》。之后让rtmp streamer对srs或者zlmediakit的rtmp地址“rtmp://124.xxx.xxx.xxx/live/test”推流,推流过程的rtmp streamer录制界面如下图所示。
观察华为云上的zlmediakit日志如下,可见rtmp streamer正在向后端的流媒体服务器推送直播流:
[mediaserver] [412449-event poller 0] rtmpprotocol.cpp:442 check_c1_diges | check rtmp complex handshark success!
[mediaserver] [412449-event poller 0] rtmpsession.cpp:128 operator() | 1-11(223.xxx.xxx.xxx:61202) publish 回复时间:0ms
[mediaserver] [412449-event poller 0] mediasource.cpp:517 emitevent | 媒体注册:rtmp://__defaultvhost__/live/test
[mediaserver] [412449-event poller 0] mediasink.cpp:161 emitalltrackready | all track ready use 215ms
[mediaserver] [412449-event poller 0] mediasource.cpp:517 emitevent | 媒体注册:fmp4://__defaultvhost__/live/test
[mediaserver] [412449-event poller 0] multimediasourcemuxer.cpp:551 onalltrackready | stream: rtmp://__defaultvhost__/live/test , codec info: mpeg4-generic[32000/2/16] h264[480/640/0]
[mediaserver] [412449-event poller 0] mediasource.cpp:517 emitevent | 媒体注册:rtsp://__defaultvhost__/live/test
[mediaserver] [412449-event poller 0] mediasource.cpp:517 emitevent | 媒体注册:ts://__defaultvhost__/live/test
[mediaserver] [412449-event poller 0] mediasource.cpp:517 emitevent | 媒体注册:hls://__defaultvhost__/live/test
然后启动电脑上的流媒体播放器vlc media player,打开网络串流“rtmp://xxx.xxx.xxx/live/test”,此时vlc media player的视频播放界面如下图所示。
观察华为云上的zlmediakit日志如下,可见vlc media player正在从后端的流媒体服务器拉取直播流:
[mediaserver] [412449-event poller 0] rtmpprotocol.cpp:442 check_c1_digest | check rtmp complex handshark success!
[mediaserver] [412449-event poller 0] rtmpsession.cpp:367 operator() | 2-16(112.xxx.xxx.xxx:51055) play 回复时间:1ms
结合rtmp streamer直播录制画面和vlc media player的直播观看界面,可知通过rtmp streamer成功实现了rtmp协议的直播功能。
更多详细的ffmpeg开发知识参见《ffmpeg开发实战:从零基础到短视频上线》。
发表评论