SRS4支持了WebRTC播放,John(志宏)大神实现了RTC框架,Bepartofyou(B神)实现了aac转opus,刘连响大神主持定义的协议保持RTMP、HLS、FLV、WebRTC的高度一致性,另外Native Demo正在路上,后续还有更多惊喜。
Scenarios
SRS支持WebRTC后,将获得下面新的应用场景:
- 低延迟直播:RTMP延迟在3到5秒,WebRTC可以在1秒之内,可以基于云计算部署比较稳定的低延迟直播服务;也可以接入CDN厂商,目前阿里云和腾讯云CDN都支持了WebRTC直播方式。
- 一对一通话:在一对一通话中,推一路流拉一路流,经过SRS服务器转发的通话质量会更高;若没有服务器转发,直接P2P方式一般效果比较差。目前SRS还未支持WebRTC推流,正在开发中。
- 直播连麦:可以在一对一通话基础上,在主播端开OBS抓取通话窗口,合流成为RTMP后再直播出去。比较完善的是在服务器上合流,SRS目前还没有计划,可以自行开发。
- 直播H5播放器:Flash将在2020年左右禁用,目前H5播放直播一般使用MSE技术用flv.js或hls.js或dash.js播放直播流,SRS可以将直播转成WebRTC后可以用WebRTC播放直播流,作为一种补充播放器。
- 监控播放器:SRS正在合并GB28181的支持的PR,很快将支持GB28181,摄像头可以直接将流推送到SRS,可以用H5播放器播放流,监控摄像头的流就可以在浏览器无插件播放。
- 组合场景:上述场景还可以组合,比如摄像头可以GB28181推流后直播,或者SRS作为会议中的网关可以让监控摄像头入会,或者结合SRT做跨国的推流和通话,还可以作为控制协议比如控制远程摄像机。
SRS的核心定位是互联网的流媒体服务器,主要支持互联网的场景,包括:
- 互联网分发:浏览器和CDN支持的方式分发流,比如RTMP、FLV、HLS、WebRTC等方式,浏览器和CDN都支持,可以被互联网用户直接消费,触达庞大的互联网用户群体。
- 协议转换网关:支持SRT是为了支持广电和直播行业互联网化,支持GB28181是为了监控和智能家居行业互联网化,支持WebRTC是视频会议行业互联网化。
SRS的目标是像Nginx成为标准的Web服务器一样,成为视频的标准服务器。
Demo
废话不多说,点阅读原文,或者按下面的步骤,只需要一个命令就可以:
docker run -p 1935:1935 -p 8080:8080 -p 1985:1985 -p 8000:8000/udp --env CANDIDATE=192.168.1.3 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v4.0.14 objs/srs -c conf/rtc.conf
Note: 请将上面的IP换成你的IP。WebRTC是在SDP中交换的服务器地址,SRS在docker中运行时自动获取的是docker的内网ip,在浏览器中无法访问这个IP,所以需要将服务器的IP配置给docker。
这样支持RTMP和RTC的SRS就跑起来了。可以使用FFMPEG或OBS推流:
ffmpeg -re -i doc/source.200kbps.768x320.flv -c copy -f flv -y rtmp://192.168.1.3/live/livestream
可以播放RTMP或WebRTC地址:
- RTMP流:rtmp://192.168.1.3/live/livestream
- WebRTC流:webrtc://192.168.1.3/live/livestream
Remark:要使用rtc_player才能播放RTC流,请使用Chrome浏览器打开这个地址:http://ossrs.net/players/rtc_player.html Note: 这个实例只配置了RTMP和RTC流,其他的流可以修改配置文件支持。
效果图如下:
代码已经提交到了develop分支,也可以编译和调试。
Milestones
目前SRS4支持的功能包括:
- RTMP推流,WebRTC播放,WebRTC推流还在开发中。
- AAC转成Opus,直播主要是AAC,而WebRTC是Opus。
- H5播放器rtc_player.html,已经放在了SRS网站上。
- 支持UDP端口复用,默认UDP/8000端口传输数据。
- 支持通过ENV设置IP,在docker中比较方便使用。
- 裁剪的FFMEPG库,静态库链接,后续会支持动态库链接。
- 使用FFMPEG-AAC编解码(LGPL),没有用GPL的fdkaac。
- 支持丢弃B帧,避免抖动,后续会支持高级丢帧。
正在计划中和开发中的功能包括:
- Native播放器,刘连响大神开发完成,正在联调中。
- 兼容Firefox和Safari等浏览器,目前主要支持Chrome。
- 支持动态链接FFMPEG的库,遵守LGPL协议。
- 高级丢弃B帧,根据引用关系丢帧,避免局部花屏。
- WebRTC上行推流,避免音频转码。
- 支持切网,移动端可能会变更网络。
未来可能会支持的功能包括:
- 单PC和SFU,支持拉多路流。
- 支持直播连麦,MCU服务器合流。
- 支持Simulcast多流。
- 支持屏幕分享。
Thanks
特别感谢以下朋友,没有你们SRS就无法支持WebRTC:
- John,志宏大神,只用了10天左右就在SRS上实现了RTC的框架。另外,SRS用到的ST的库支持ARM的汇编代码,也是John实现的;而且,John也完整调研了用微信libco替代ST的可能性,结果发现ST是最合适的协程库。
- B.P.Y(Bepartofyou),B神,只用了4天就完成了aac转opus,将FFMPEG代码从84MB裁剪到了8MB左右,只保留了必要的代码;aac转opus意味着直播和RTC的打通,是极其重要的能力。
- 刘连响大神,定义了WebRTC播放流的协议,让RTC和RTMP、FLV、HLS等协议保持了高度的一致,并且能和阿里云以及腾讯云兼容,可以无缝从开源方案迁移到大规模商用方案。另外连响也在做Native客户端,RTC更强大的可能是在Native上的应用。
特别感谢一下朋友,为SRS支持WebRTC做出了突出的贡献:
- 大师兄,推荐了B神解决了编解码问题。另外,FFMPEG实现了aac的编解码库,协议是LGPL,一并感谢FFMPEG让SRS有符合开源协议的库可用。
- 施维大神,在nginx上实现过部分的RTC,也尝试移植这部分代码到SRS,后续拥塞控制算法还需要施维大神才能解决。另外,施维大神也是SRS支持SRT的maintainer,解决了SRS支持跨国等远程弱网传输的难题。
热烈欢迎John和B.P.Y成为SRS maintainer,成为视频行业的造风者,目前SRS已经有5位maintainer,后续将会迎来更大的爆发:
- Winlin,负责系统框架。
- Wenjie,负责HDS。
- Runner365(施维大神),负责SRT。
- John(志宏大神),负责RTC。
- B.P.Y(B神),负责RTC编解码。
视频正在异军突起,成为数字经济时代的基础设施之一。SRS的目标是像Nginx成为标准的Web服务器一样,成为视频的标准服务器。SRS将持续努力,不避锋芒,不媚逢迎,不辞风雨,不患得失,不畏将来,不念过往。