webrtc_fec_layer
引言
- webrtc的fec逻辑可以分为3层:
- 第一层是buffer层,是基础的fec算法,如异或fec。
- 输入可以是"任意"长度的字节, 所以我称之为buffer层, 输出异或运算后的结果。
- 第二层是包层。
- 输入的是带序号的包,输出也是包。
- 第三层是帧层。
- 这一层有视频包的感知,对帧这一级别进行FEC编解码策略控制。
从分层的角度看webrtc的fec

Figure 1: fec的类是分层的
类与层次的关系
- 在webrtc代码中,Buffer和包这2层实际上处于ForwardErrorCorrection这个类中
- 最基础的FEC算法用的是奇偶FEC,优点是计算速度快
帧级FEC
- 帧级FEC和包级FEC的关系
- 帧级FEC能感知到帧的概念,利用帧的信息和配置在适当的时机调用ForwardErrorCorrection::encode对媒体包进行编码,输出fec报文
- 帧级FEC缓存接收的包,并调用ForwardErrorCorrection::decode尝试恢复FEC,并将恢复的包发送给视频模块
- 帧级FEC有FlexFec和UlpFec这2个实现
- 序号不同
- flex是flex内部产生的的
- 而ulp是外部生成的
- 协议不同
- ProcessReceivedPacket的返回
- flex只返回恢复的数据包,而ulpfec返回所有包(接收的数据包、恢复的数据包)
- rfc文档的链接如下,有空的朋友可以看看,webrtc的实现并没有完整支持rfc的
- 序号不同
总结
- 我们了解了webrtc里面的fec相关类,并通过分层的概念了解了各层的输入、输出和差别。
- 留下几个问题给大家思考
- flexfec和ulpfec的有什么差异?
- 除了异或fec,还有什么其他fec算法?各有什么优缺点?应用场景有什么不同?
- 对于实际的场景,FEC是在各个层之间怎么流转的?