丢包处理可以使用FEC前向纠错、NACK丢包重传。上一篇文章咱们介绍过前向纠错,现在来探讨丢包重传。首先是接收端发送基于RTCP反馈的请求,发送端收到请求后重传指定packet包。
1、重传包格式
重传包的格式由RTP头、OSN、原始payload数据组成。OSN表示原始序列号,如下图所示:
2、重传包RTP头
重传包的时间戳必须与原始包保持一致。如果原始包的RTP头有扩展字段,那么重传包也必须携带相同的扩展字段。如果原始包包含padding填充数据,那么重传包应该移除padding填充数据或者把padding标志位置为1。
3、重传与原始stream关系
在session多路复用的场景,重传stream和原始stream共享同一个session会话。另外,重传stream和原始stream共享同一个CNAME。
4、重传请求
NACK通过rtcp-fb反馈消息,由接收端发起的重传请求。发送重传请求之前,接收端应该考虑带宽、延时、媒体包类型等因素。除了重传请求,接收端还应该发送RR(Receiver Report)来报告RTT延时。接收端在检测到丢包时不应该马上发送丢包重传请求,而是加上延时来补偿重排序的包。
丢包重传的类型如下(不仅限于):
FIR:请求关键帧,对应PT=192;
NACK:否定应答,对应PT=193;
RTPFB:rtp丢包重传,对应PT=205;
PSFB:指定payload重传