一、概述
webrtc的FEC冗余度配置整体思想是:
1、接收端根据收到报文情况计算一个丢包率,通过RTCP_RR报文反馈给发送端。
接收端丢包率计算代码走读请参见:《webrtc代码走读十一(RTCP丢包率、环路延时计算)》
2、发送端解析RTCP_RR报文,获取丢包率信息。然后使用一种算法,根据历史丢包率,预估未来一段窗口期的丢包率。
3、发送端使用预估的丢包率,查表计算I帧、P帧的冗余度。
4、FEC模块根据冗余度信息,封包FEC报文。
二、解析丢包率计算冗余度流程
这里仅描述了定时调用SendSideCongestionController::MaybeTriggerOnNetworkChanged函数流程,其实还有很多场景调用改函数,更新FEC冗余度参数。
三、根据冗余度参数封装FEC报文
四、预估未来丢包率算法
webrtc提供三种预估未来时间窗丢包率算法:
1、使用当前丢包率
2、使用一阶指数平滑算法,预测丢包率。
- 使用公式:
- 实现代码
参见:float ExpFilter::Apply
- 基本思想
预测值是以前观测值的加权和,且对不同的数据给予不同的权,新数据给较大的权,旧数据给较小的权。
3、使用一段窗口期内的最大丢包率
- 丢包率入队
- 选取窗口期内最大值