为什么我要开始着手SRT
为什么我觉得SRT有趣?我们知道RTMP是公共互联网上直播视频的事实标准;但RTMP已经存在了很长一段时间,其标准在2012年最后一次更新过后就被放弃了。新的Codec标准诸如HEVC或AV1一般都没有RTMP标准支持。退一步来说,即使有人在RTMP中hack了这些Codec的支持,在移动网络上RTMP仍然工作的不大好。
SRT作为RTMP潜在替换技术的一种,最近正获得不错的增长势头。SRT联盟现在有250多名成员,而在最近的一些展会上,似乎每个展位都具有 SRT 联盟成员或 SRT-Ready贴纸。
最主要的还是rtmp这个协议实在太老了。
- rtmp协议最后一次更新在2012年
- rtmp在移动互联网时代,缺陷越来越明显。
- rtmp是基于tcp的,弱网环境表现差;
- rtmp基于tcp的丢包重传,拥塞控制实在太差;
移动互联网时代越来越呼唤新的直播协议,srt也是在这条探索路上的选择。
因此,基于SRS3.0上开发支持SRT的功能。
当前srs支持srt的功能:
- 支持srt的推流
- 支持srt的拉流
- 支持基于vhost的srt流模式
- 支持srt推流转发本地rtmp
直接上代码,本人基于SRS3.0实现支持SRT:https://github.com/runner365/srs
在srs主仓库中,也合入分支:https://github.com/ossrs/srs/tree/feature/srt
如何编译,配置和使用wiki: 如何在SRS中支持srt
srt原协议我自己的翻译: srt协议解析
关于srt的推/拉流模式
因为srt是传输层协议,没有明确的推拉流控制定义,但是srt官网有文章推荐使用streamid来定义推流/拉流.
基于srt官网的文章:srt acesscontrol
最新的srt推流地址规范如下,streamid的内容以#!::为开始,符合YAML标准。
默认vhost的url
- SRT的推流地址:
srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=publish
- SRT的拉流地址:
srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=request
- 对应的rtmp拉流地址:
rtmp://127.0.0.1/live/livestream
定制化vhost的url
- SRT的推流地址:
srt://127.0.0.1:10080?streamid=#!::h=srs.srt.com.cn/live/livestream,m=publish
- SRT的拉流地址:
srt://127.0.0.1:10080?streamid=#!::h=srs.srt.com.cn/live/livestream,m=request
- 对应的rtmp拉流地址:
rtmp://127.0.0.1/live/livestream?vhost=srs.srt.com.cn
基于srt官网,streamid的格式有Standard Keys,srt in srs的服务尽量符合官网标准。
The Stream ID value can be used as free-form, but there is a recommended convention so that all SRT users speak the same language. The intent of the convention is to:
- promote readability and consistency among free-form names
- interpret some typical data in the key-value style
符合yaml格式,以#!::为开始。
- key为h,表示vhost和appname/stream;
- key为m,表示推流(publish)/拉流(request);