基于srs的低延迟直播平台搭建

  |   2,418 浏览

前情提要

前面已经介绍了如何使用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的级联和集群。

每个场景可能会用到一些通用的能力,比如:

好了,简介的砖就不再多搬了,详细见官方官网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