SRT流媒体传输协议小结


摘抄自Cogent的微信公众号
https://mp.weixin.qq.com/s/3kyRZiqpfQ_CihMAAU7UmA

连接过程

握手模式

caller

作为连接的发起者,知道对应设置Listener模式设备的公网IP地址及其监听的UDP端口。

  1. 让一台设备发起建立一个点对点传输的SRT连接;
  2. 设备所在的网络有防火墙,但没有防火墙操作权限;
  3. 设备的IP地址是DHCP动态获取的;
  4. 设备没有固定的公网IP地址。

Listener

监听发起的SRT请求,需要知道使用哪个UDP端口,并在这个端口一直监听。

  1. 让一台设备监听发起SRT会话的请求;
  2. 设备所在的网络有防火墙,并且可以控制防火墙,打开需要的UDP端口;
  3. 设备直接暴露在公网环境下。

Rendezvous

两端共同协商建立连接,基本不使用此种连接

  1. 两台设备所在的网络都有防火墙,但是没有防火墙的操作权限,如果防火墙设置了适当的工作模式(将在Section 3. SRT实际应用场景中详细介绍),可通过此模式建立SRT会话。

参数

  1. Round Trip Time(RTT)——往返延时
    发送端发送数据后收到来自及手段的确认中间的时间差,ping命令查看

  2. RTT Multiplier(RTT倍数)

    计算SRT延时的数值,反应拥塞程度和RTT之间的关系,该值用于调整SRT延时

    SRT Latency = RTT Multiplier * RTT

  3. Packet Loss Rate(丢包率)

    丢掉的数据包占总发包的百分比

    • Constantloss(稳定丢包)

      丢包比例基本稳定,不会出现太大波动,这是需要SRT开销不小于理论值

      Minimum Bandwidth Overhead = 1.65 * Packet Loss Rate

    • Burstloss(爆发式丢包)

      链路出现大量连续丢包,丢包量大于等于SRT latency buffer(缓冲区)内缓存的数据量,要稳定传输,需要SRT开销不小于理论最小值

      Minimum Bandwidth Overhead = 100 ÷ RTT Multiplier

  4. Bandwidth Overhead(带宽开销)

    根据网络质量设置的百分比,和视音频总码率相乘,得到的值和总码率相加即当前SRT传输贷款的阈值

    作用是传输伴随SRT流的控制信息数据包,还有媒体数据包的重传,开销角度理解就是用来恢复丢包的额外开销,需要占用的“无效”带宽

    这个值可以是5%~100%,默认25%。

    ffmpeg相关设置

    ​ oheadbw=percents

    ​ inputbw=byte/seconds

    其中inptbw * (100 + oheadbw) / 100

  5. Latency(延时)

    这个延时代表了可用于管理SRT数据包最大的buffer大小。

    SRT源设备的buffer会对没有发出的数据包在内部排序,也会保存那些没有被确认收到的数据包。

    SRT目标设备buffer会对收到的包进行排序,保存已经收到并等待解码的数据包(16进制排序)

    如果网络环境比较好,丢包率0.1%~0.2%,可以将RTT Multiplier取为4

    SRT Latency = 4 * RTT

    这个参数在两端都可以设置,最终将取两端中值比较大的哪一个

  6. Passphrase(密码)

    ffmpeg参数使用passphrase=string

SRT延时设置的越高,buffer中能存储的数据就越多,可以保证一定时间内输出解码部分的数据流不中断,突然丢包时,SRT源设备会使用SRT最大可用的带宽中未使用的带宽去传输丢失的数据包。

参数设置

  1. 检测RTT值

    使用ping来查看RTT,当RTT ≤ 20ms,视RTT为20ms

  2. 检测丢包率

    Packet Loss Rate = Resent Bytes ÷ Sent Bytes * 100

    丢包率影响SRT Latency和Bandwidth Overhead,可以通过ipdef检测

    本机检测

    ​ server ------------ iperf -s -p 12345 -i 1

    ​ client ------------- iperf -c 127.0.0.1 -u -b 5.5m -i 1 -p 12345

  3. 通过丢包率,在表中查找对应的RTT Multiplier和BW Overhead值

    网络最高丢包率 RTT Multiplier BW Overhead 最小SRT Latency(在RTT ≤ 20ms时)
    ≤ 1 3 33 60
    ≤ 3 4 25 80
    ≤ 7 5 20 100
    ≤ 10 6 17 120
    1. 其中表格内内BW Overhead为稳定丢包和爆发丢包均考虑,取两种情况的较大值,较大值为100 / RTT Multiplier
    2. SRT Latency为RTT ≤ 20ms时(RTT取值为20ms),实际使用时应带入实测的RTT值
    3. 表格基本代表了一般情况下最高效的SRT设置,网络变差或者希望容错率更高,也可以取更大的值
  4. 通过以下公式确定SRT Latency

    SRT Latency = RTT Multiplier * RTT

    当RTT ≤ 20ms,统一取20ms

  5. 测试可用链路带宽

    iperf测试

  6. 确定传输码率

    SRT传输码率包括视频、音频、元数据等,加上SRT协议开销,使用以下公式

    Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100

    如果不满足以上公式,减小视音频码率知道满足

    一般建议保留更多带宽抵抗不断变化的链路带宽,所以下式更具安全性

    0.75 * Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100

  7. 检查SRT传输参数设置是否正确

    传输开始后,看Send Buffer数值应该始终不超过SRT Latency的值,如果十分接近,应当适当增加SRT延时

    • 如果偶尔超过,增大SRT延时
    • 如果经常超过,需要增大带宽
发布了89 篇原创文章 · 获赞 96 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Boring_Wednesday/article/details/89209500