摘抄自Cogent的微信公众号
https://mp.weixin.qq.com/s/3kyRZiqpfQ_CihMAAU7UmA
连接过程
握手模式
caller
作为连接的发起者,知道对应设置Listener模式设备的公网IP地址及其监听的UDP端口。
- 让一台设备发起建立一个点对点传输的SRT连接;
- 设备所在的网络有防火墙,但没有防火墙操作权限;
- 设备的IP地址是DHCP动态获取的;
- 设备没有固定的公网IP地址。
Listener
监听发起的SRT请求,需要知道使用哪个UDP端口,并在这个端口一直监听。
- 让一台设备监听发起SRT会话的请求;
- 设备所在的网络有防火墙,并且可以控制防火墙,打开需要的UDP端口;
- 设备直接暴露在公网环境下。
Rendezvous
两端共同协商建立连接,基本不使用此种连接
- 两台设备所在的网络都有防火墙,但是没有防火墙的操作权限,如果防火墙设置了适当的工作模式(将在Section 3. SRT实际应用场景中详细介绍),可通过此模式建立SRT会话。
参数
-
Round Trip Time(RTT)——往返延时
发送端发送数据后收到来自及手段的确认中间的时间差,ping命令查看 -
RTT Multiplier(RTT倍数)
计算SRT延时的数值,反应拥塞程度和RTT之间的关系,该值用于调整SRT延时
SRT Latency = RTT Multiplier * RTT
-
Packet Loss Rate(丢包率)
丢掉的数据包占总发包的百分比
-
Constantloss(稳定丢包)
丢包比例基本稳定,不会出现太大波动,这是需要SRT开销不小于理论值
Minimum Bandwidth Overhead = 1.65 * Packet Loss Rate
-
Burstloss(爆发式丢包)
链路出现大量连续丢包,丢包量大于等于SRT latency buffer(缓冲区)内缓存的数据量,要稳定传输,需要SRT开销不小于理论最小值
Minimum Bandwidth Overhead = 100 ÷ RTT Multiplier
-
-
Bandwidth Overhead(带宽开销)
根据网络质量设置的百分比,和视音频总码率相乘,得到的值和总码率相加即当前SRT传输贷款的阈值
作用是传输伴随SRT流的控制信息数据包,还有媒体数据包的重传,开销角度理解就是用来恢复丢包的额外开销,需要占用的“无效”带宽
这个值可以是5%~100%,默认25%。
ffmpeg相关设置
oheadbw=percents
inputbw=byte/seconds
其中inptbw * (100 + oheadbw) / 100
-
Latency(延时)
这个延时代表了可用于管理SRT数据包最大的buffer大小。
SRT源设备的buffer会对没有发出的数据包在内部排序,也会保存那些没有被确认收到的数据包。
SRT目标设备buffer会对收到的包进行排序,保存已经收到并等待解码的数据包(16进制排序)
如果网络环境比较好,丢包率0.1%~0.2%,可以将RTT Multiplier取为4
SRT Latency = 4 * RTT
这个参数在两端都可以设置,最终将取两端中值比较大的哪一个
-
Passphrase(密码)
ffmpeg参数使用passphrase=string
SRT延时设置的越高,buffer中能存储的数据就越多,可以保证一定时间内输出解码部分的数据流不中断,突然丢包时,SRT源设备会使用SRT最大可用的带宽中未使用的带宽去传输丢失的数据包。
参数设置
-
检测RTT值
使用ping来查看RTT,当RTT ≤ 20ms,视RTT为20ms
-
检测丢包率
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
-
通过丢包率,在表中查找对应的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 - 其中表格内内BW Overhead为稳定丢包和爆发丢包均考虑,取两种情况的较大值,较大值为
100 / RTT Multiplier
- SRT Latency为RTT ≤ 20ms时(RTT取值为20ms),实际使用时应带入实测的RTT值
- 表格基本代表了一般情况下最高效的SRT设置,网络变差或者希望容错率更高,也可以取更大的值
- 其中表格内内BW Overhead为稳定丢包和爆发丢包均考虑,取两种情况的较大值,较大值为
-
通过以下公式确定SRT Latency
SRT Latency = RTT Multiplier * RTT
当RTT ≤ 20ms,统一取20ms
-
测试可用链路带宽
iperf测试
-
确定传输码率
SRT传输码率包括视频、音频、元数据等,加上SRT协议开销,使用以下公式
Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100
如果不满足以上公式,减小视音频码率知道满足
一般建议保留更多带宽抵抗不断变化的链路带宽,所以下式更具安全性
0.75 * Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100
-
检查SRT传输参数设置是否正确
传输开始后,看Send Buffer数值应该始终不超过SRT Latency的值,如果十分接近,应当适当增加SRT延时
- 如果偶尔超过,增大SRT延时
- 如果经常超过,需要增大带宽