posts

vnn01

webrtc_fec_layer

引言

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

从分层的角度看webrtc的fec

Figure 1: 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个实现

总结

  • 我们了解了webrtc里面的fec相关类,并通过分层的概念了解了各层的输入、输出和差别。
  • 留下几个问题给大家思考
    • flexfec和ulpfec的有什么差异?
    • 除了异或fec,还有什么其他fec算法?各有什么优缺点?应用场景有什么不同?
    • 对于实际的场景,FEC是在各个层之间怎么流转的?