FEC前向纠错用于丢包恢复,对媒体包进行异或或其他算法生成冗余包进行发送。如果接收端出现丢包,可以通过冗余包恢复出原始的媒体包。FEC的代价是增加码率带宽,所以一般会根据网络状况、丢包率来动态调整FEC冗余系数,也会结合NACK/ARQ丢包重传使用。WebRTC使用的FEC包括:ULP、flex、RED三种协议。接下来,我们主要分析ULP的协议结构。
ULP全称为Uneven Level Protection,不均匀级别保护,权衡网络带宽和保护力度。FEC冗余包越多,丢包恢复能力越强,但是带宽消耗越多。并不是所有媒体包的优先级都相同,因此可根据优先级来划分保护等级,比如优先分配给音频包,然后是视频的I帧包,接着是P帧、B帧。
1、ULP结构
基于ULP的FEC包有一个或多个保护等级。如下图所示,FEC包#1只有一个等级,用于保护媒体包A和B;而FEC包#2有两个等级,0级用于保护媒体包C和D,1级用于保护媒体包A、B、C、D。
2、FEC数据包结构
FEC数据包由RTP头、FEC头、FEC等级、FEC载荷组成,如下图所示。
3、FEC头结构
FEC头的结构由:扩展位E、长掩码L、填充位P、扩展标志X、CSRC计数、标志位M 、PT载荷类型、基本序列号、时间戳、长度组成,占8个字节。如下图所示:
E:扩展位,占1 bit,默认为0;
L:长掩码,占1 bit,L=0时掩码长度为16 bits,L=1时掩码长度为48 bits;
P、X、CC、M、PT与RTP头的数值一致;
SN base:基本序列号,占16 bits;
TS recovery:恢复包的时间戳,占32 bits;
length recovery:恢复包的长度,占16 bits;
4、 FEC的ULP等级
FEC的等级头占4或8字节,当L=0时头部长度为4字节,当L=1时头部长度为8字节。其中,保护长度占16 bits,mask掩码占16 bits,当L=1时有扩展mask占32 bits。
掩码的设置需要符合以下条件:
(1)、保护等级大于0的媒体包只会被保护一次,保护等级等于0的媒体包可以被多次保护;
(2)、假设媒体包的保护等级为p,它可以被等级为p-1的任意FEC包进行保护;
(3)、假设FEC包包含保护等级p,它必须包含保护等级p-1;
5、生成FEC包
FEC包由媒体包逐位异或得到,并且根据每个等级生成不同的FEC包。假如RTP媒体包之间长度不同,需要以最长的媒体包为基准,其他媒体包添加填充位。
单个保护等级的FEC包示例如下,这里以媒体包D长度为准,其他媒体包后面填充0:
两个保护等级的FEC包示例如下:
6、FEC应用SDP会话
如下图所示,分为2个FEC组:第一组为"a=group:FEC 1 2",由音频流1和ulpfec流2组成;第二组为"a=group:FEC 3 4",由视频流3和ulpfec流4组成。