1.简介
前面讲了SRT有三种模式,那么这节来说说Listener模式服务端的搭建。关于Listener模式之前在sample中的srt-file-transmit和srt-live-transmit就有简单用到,本章的Listener模式服务端,考虑到实际生产使用,就采用开源项目srs进行搭建。
SRS是一个开源的(MIT协议)简单高效的实时视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等协议。 SRS媒体服务器和FFmpeg、OBS、VLC、 WebRTC等客户端配合使用,提供流的接收和分发的能力,是一个典型的发布 (推流)和订阅(播放)服务器模型。 SRS支持互联网广泛应用的音视频协议转换,比如可以将RTMP或SRT, 转成HLS或HTTP-FLV或WebRTC等协议。
SRS提供了HTTP API开放接口,可以查询系统的状态和流状态。同时还支持HTTP Callback 支持回调能力,主动通知你的系统,并可以实现流的鉴权能力和业务定制(比如动态DVR)。SRS也支持官方的Prometheus Exporter 对接到云原生的监控系统,具备强大的可观测性。SRS支持会话级别可追踪日志,极大降低了系统维护成本。
SRS使用ANSI C++ (98)开发,只使用了基本的C++能力,可以在Linux、Windows、macOS等多个平台运行。
2.下载SRS源码
https://github.com/ossrs/srs.git
3.编译源码
cd srs/trunk
./configure --srt=on
make
make install
4.编写SRS配置文件
将以下内容保存为文件,譬如conf/srt.conf
,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。
# conf/srt.conf
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
srt_server {
enabled on;
listen 10080;
}
vhost __defaultVhost__ {
}
5.启动SRS
./objs/srs -c conf/srt.conf
6.推流测试
1.借助FFMPEG产生一个UDP流,当然有其他方式也行:
ffmpeg -stream_loop -1 -re -i /home/msatartup.mp3 -f mpegts udp://127.0.0.1:12001?pkt_size=1316
2.采用srt-live-transmit工具作为caller方进行推流
srt-live-transmit udp://127.0.0.1:12001 'srt://127.0.0.1:10080?streamid=#!::r=live/livestream,m=publish'
3.采用srt-ffplay工具作为caller方进行推流
srt-ffplay 'srt://127.0.0.1:10080?streamid=#!::r=live/livestream,m=request'
7.SRS对SRT的URL的格式要求
因为srt是四层传输协议,所以无法确定对某个srt url操作是推流还是拉流。
在srt官网中有对推/拉流实现方法的推荐:AccessControl.md 关键方法是通过streamid参数来明确url的作用,streamid的格式符合YAML格式。
7.1.SRT URL no Vhost
srt url举例:
- 推流地址:
srt://127.0.0.1:10080?streamid=#!::r=live/livestream,m=publish
- 拉流地址:
srt://127.0.0.1:10080?streamid=#!::r=live/livestream,m=request
- 对应的rtmp拉流地址为:
rtmp://127.0.0.1/live/livestream
其中:
- #!::
- 开始标记,符合yaml格式标准
- r
- 映射到rtmp地址中的/app/stream;
- m
- publish表示推流。
- request表示拉流。
7.2.SRT URL for Vhost
srt url举例:
- 推流地址:
srt://127.0.0.1:10080?streamid=#!::h=srs.srt.com.cn,r=live/livestream,m=publish
- 拉流地址:
srt://127.0.0.1:10080?streamid=#!::h=srs.srt.com.cn,r=live/livestream,m=request
- 对应的rtmp拉流地址为:
rtmp://127.0.0.1/live/livestream?vhost=srs.srt.com.cn
其中:
-
h
- 映射到rtmp地址中的vhost;
8.问题
前面我们知道SRT在网络传输层运行,它可以传输任何类型的视频格式、编解码器、分辨率或帧速率。
但目前的SRS/4.0.265发布版本,在接收到SRT推流时,会将流自动转换为RTMP协议输出,导致对音视频编码格式有了要求,使用起来十分不方便。好在使用最新的SRT开发版本,已经在着手解决该问题。另外,也可以通过修改SRS的源码,暂时关闭SRS到RTMP的输出功能;