SRS开始支持SRT

为什么我要开始着手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:
  1. promote readability and consistency among free-form names
  2. interpret some typical data in the key-value style


    符合yaml格式,以#!::为开始。
  • key为h,表示vhost和appname/stream;
  • key为m,表示推流(publish)/拉流(request);
要使用 SRS 推拉 SRT 流,需要确保 SRS 已经正确配置并支持 SRT 协议。SRS 在编译和启动时已经默认支持 SRT,可以通过修改配置文件 `srt.conf` 来启用 SRT 服务。 ### 配置 SRS 支持 SRT 在 `srt.conf` 文件中找到 `srt_server` 部分的配置信息,确保其内容如下: ```conf srt_server { enabled on; listen 10080; maxbw 1000000000; connect_timeout 4000; peerlatency 0; recvlatency 0; latency 0; tsbpdmode off; tlpktdrop off; sendbuf 2000000; recvbuf 2000000; } ``` 此配置启用了 SRT 服务,并将其绑定到端口 `10080` [^3]。 ### 使用 FFmpeg 推送 SRT 流 推送 SRT 流可以使用 FFmpeg 工具,命令如下: ```bash ffmpeg -re -i input.mp4 -c:v h264 -f mpegts srt://<SRS_IP>:10080?streamid=livestream ``` 其中 `<SRS_IP>` 替换为运行 SRS 服务器的 IP 地址,`streamid` 是流的标识符 [^3]。 ### 使用 FFmpeg 拉取 SRT 流 拉取 SRT 流同样可以使用 FFmpeg,命令如下: ```bash ffmpeg -i srt://<SRS_IP>:10080?streamid=livestream -c copy output.mp4 ``` 这里 `output.mp4` 是输出文件名 [^3]。 ### SRS 服务器实现细节 SRS 服务器内部通过 `SrsSrtServer::listen()` 函数调用 `listen_srt_mpegts` 来监听 SRT 连接。`listen_srt_mpegts` 创建 `SrsSrtAcceptor` 对象,并执行 `SrsSrtAcceptor::listen` 方法来开始监听指定的端口 [^2]。 ### 相关问题 1. 如何在 CentOS 上安装 SRS 并启用 SRT 协议? 2. SRT 协议相较于 RTMP 协议有哪些优势? 3. 如何测试 SRS 服务器上的 SRT 流是否正常工作? 4. 使用 SRT 协议进行视频直播时需要注意哪些网络设置? 5. 如何利用 SRS 和 FFmpeg 实现高效的视频转码与分发?
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值