爲什麼我要開始着手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);