SRS5.0第一大炮:如何实现SRT协程化

SRS 5.0迈出了关键一步,实现了SRT协程化,解决了SRT在SRS上的多线程和异步问题,提高了维护性和性能。这一改进使得SRS能更好地支持媒体网关功能,如SRT到RTMP/HLS/WebRTC的转换,降低延迟并利用SRT的跨国传输优势。
摘要由CSDN通过智能技术生成

1.Coroutine Native SRT


Written by John[1], Winlin[2]

协程是现代服务器的核心技术,能极大简化逻辑和提升维护性;SRT是逐渐在取代RTMP推流的新协议,但它有自己的IO框架;只有实现了SRT的协程化,才能成为SRS的核心的成熟的协议,这是SRS 5.0迈出的第一步,也是至关重要的一步。

SRS 5.0从2022年初启动以来,经过摸索和探讨,确定了以媒体网关作为核心方向,详细请看SRS 5.0核心问题定义和解法

SRT作为主播/广播推流领域广泛采用的协议,浏览器却不支持播放SRT推流,这恰恰是媒体网关的核心价值,可以将SRT转成RTMP/HLS/WebRTC后,实现广播领域真正的Web超低延迟方案,还可以把SRT强大的跨国传输能力用起来。

而这些美好愿景的基础,就是这次要介绍的:改造SRT支持协程化(Coroutine Native SRT)。这是SRS 5.0至关重要的一步,也是具备深远影响的一步,详细代码请参考PR#3010[3]。

我们先了解下详细的背景介绍。

2.Introduction


在直播推流领域,RTMP是事实上的工业标准,广泛使用,也是直播源站之间兼容性最好的协议。

随着场景的丰富和直播的发展, 几个比较严重的问题逐渐暴露出来:

  1. \1. TCP推流在长距离传输下,受丢包以及RTT抖动影响非常大,效果很差。

  1. \2. RTMP协议不支持多音轨,以及H265、AV1等一系列新的编解码。

  1. \3. Adobe已经放弃RTMP协议,很多年没有更新了,未来也不会更新。

为了解决这些问题,2018年左右,广播电视领域开始广泛应用SRT协议推流,越来越多的推流设备和平台都支持了SRT协议。

SRS在2019年底,SRS 4.0支持了SRT推流,目前存在以下的问题:

  1. \1. SRT在SRS上使用多线程+异步实现,某些异常导致的程序Crash,难以排查。

  1. \2. SRT在SRS实现是异步方式,代码复杂,维护难度高。

  1. \3. HTTP回调,SRT播放不生效;SRT推流依赖转RTMP后,RTMP触发的回调。

  1. \4. SRT无法直接转WebRTC,而是先转RTMP再转WebRTC,导致延迟高。

这些问题的核心原因,是由于SRT使用了独立的异步IO和多线程,无法和SRS已有的ST协程结合起来。

要彻底解决这个问题,必须将SRT协程化,和SRS使用同一套ST协程框架。SRS 5.0已经完成,详细代码请参考PR#3010[4],这是非常重要的一个功能。

在介绍SRT协程化之前,先介绍下什么是协程化,我们看下ST的TCP协程化(Coroutine Native),这是最好的例子。

3.Coroutine Native TCP


首先,非协程化的代码,也就是epoll驱动的异步代码,大概逻辑是这样:

int fd = accept(listen_fd); // Got a TCP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值