基于srs的低延迟直播平台搭建
前情提要
前面已经介绍了如何使用nginx-rtmp-module搭建直播平台,也介绍了如何使用webrtc搭建音视频通话。根据这两篇文章我们只能搭建一些单一场景的视频服务。但是像直播+连麦这种场景,既要达到直播的海量用户连接,还要达到连麦这种低延迟效果。
然而这种场景我们使用上面两种技术相结合,也能搭建起来。主播使用rtmp推流,观众拉流,连麦就使用webrtc与特定观众进行即时通讯。但是缺点是,原生webrtc要进行多点通讯,带宽消耗大幅上升,rtmp推流只能使用客户端工具进行,浏览器不行。
试想如果我们可以使用webrtc将本地采集的音视频流推,观众也能拉流观看,那就方便很多了。因为webrtc打开浏览器就可以用,即能采集摄像头也能采集屏幕数据,这样直播就方便很多了,打开浏览器就开播,无需安装任何插件。但关键技术在于,如何将本地的webrtc音视频流推流到服务器。并能转换rtmp、hls或flv,这样观众就能直接观看直播。
直到发现了SRS这个视频服务器,最新4.0版本就开始支持上述场景,完美实现上述场景,并且webrtc天生就是SFU模式,也完美解决音视频会议多端互连消耗大量带宽问题。接下来就围绕SRS来讲述一下搭建和使用过程,过程也是极简。
SRS简介
SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。
我们从几个典型的应用场景来说明一下:
- 全平台直播,小荷才露尖尖角。只需要上图的Encoders(FFmpeg/OBS)推送RTMP到SRS;一台SRS Origin(不需要Cluster),转封装成HTTP-FLV流、转封装成HLS;Players根据平台的播放器可以选HTTP-FLV或HLS流播放。
- WebRTC通话业务,一对一通话,多人通话,会议室等。WebRTC是SRS4引入的关键和核心的能力,从1到3秒延迟,到100到300毫秒延迟,绝对不是数字的变化,而是本质的变化。
- 监控和广电上云,各行业风起云涌。除了使用FFmpeg主动拉取流到SRS,还可以广电行业SRT协议推流,或监控行业GB28181协议推流,SRS转换成互联网的协议观看。
- 直播低延迟和互动,聚变近在咫尺。RTMP转WebRTC播放降低播放延迟,还能做直播连麦,或者使用WebRTC推流,未来还会支持WebTransport直播等等。
- 大规模业务,带你装逼带你飞。如果业务快速上涨,可以通过Edge Cluster支持海量Players,或者Origin Cluster支持海量Encoders,当然可以直接平滑迁移到视频云。未来还会支持RTC的级联和集群。
每个场景可能会用到一些通用的能力,比如:
- 一般都需要录制成FLV/MP4,将RTMP流转码,流截图。
- 也需要和现有业务系统集成,比如HTTP回调,或者通过HTTP API接口查询流和客户端的信息。
- 使用FFmpeg主动拉取流到SRS,或者Forward处理流后转给其他服务,或者推送RTSP/UDP/FLV到SRS。
- 安全方面,使用安全策略Security设置访问,或者用HTTP API接口踢流。
- 使用VHOST虚拟服务器 隔离不同的业务,用域名作为调度单元,应用不同的配置。
好了,简介的砖就不再多搬了,详细见官方官网,github源码,gitee源码
SRS安装与配置
1、下载源代码,编译安装。
# 从官方仓库将最新版本分支4.0薅下来
git clone -b 4.0release https://gitee.com/ossrs/srs.git
# 进到源代码根目录
cd srs/trunk
# 编译
./configure && make
2、配置文件。
所有的配置文件均在srs/trunk/conf目录下。里面有个full.conf是带说明的完整配置文件,其他是一些特定功能的的配置文件。以下我们以rtc2rtmp.conf为例。
rtc2rtmp.conf文件内容如下,只有hls和dvr是自行追加的,其他内容是使用的官方默认配置:
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
http_api {
enabled on;
listen 1985;
}
stats {
network 0;
}
rtc_server {
enabled on;
listen 8000;
candidate 外网IP; # 注意此处自行修改
}
vhost __defaultVhost__ {
rtc {
enabled on;
rtc_to_rtmp on;
}
# 开启hls支持, 可使用m3u8拉流观看直播
hls {
enabled on;
hls_fragment 0.2;
hls_window 10;
hls_path ./objs/nginx/html;
hls_m3u8_file [app]/[stream].m3u8;
hls_ts_file [app]/[stream]-[seq].ts;
}
# 直播录制并存储为mp4视频
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].mp4;
dvr_plan session;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
3、启动srs
# 启动
./objs/srs -c conf/srs.conf
# 查看日志
tail -f ./objs/srs.log
SRS使用
当srs服务启动成功后,我们如何使用呢。
1、访问SRS控制台
http://[部署srs的所在外网ip]:1985/console/ng_index.html
2、官方自带的webrtc推送demo
http://[部署srs的所在外网ip]:8080/players/rtc_publisher.html
3、自定义开发时的推拉流地址:
推流地址:
webrtc://[部署srs的所在外网ip]/live/livestream
rtmp://[部署srs的所在外网ip]/live/livestream
拉流地址:
webrtc://[部署srs的所在外网ip]/live/livestream
rtmp://[部署srs的所在外网ip]/live/livestream
http://[部署srs的所在外网ip]:8080/live/livestream.m3u8
http://[部署srs的所在外网ip]:8080/live/livestream.flv