WebRTC QoS方法之视频发送端NACK实现

概念简介

与NACK对应的是ACK,ACK是到达通知技术。以TCP为例,他可靠因为接收方在收到数据后会给发送方返回一个“已收到数据”的消息(ACK),告诉发送方“我已经收到了”,确保消息的可靠。

WebRTC QoS方法之视频发送端NACK实现_第1张图片

NACK也是一种通知技术,只是触发通知的条件刚好的ACK相反,在未收到消息时,通知发送方“我未收到消息”,即通知未达。

WebRTC QoS方法之视频发送端NACK实现_第2张图片

在rfc4585协议中定义可重传未到达数据的类型有二种:

WebRTC QoS方法之视频发送端NACK实现_第3张图片

目前大家普遍使用RTP报文丢失重传,这种方式恢复周期短,相对于另外三种,对带宽影响小。

本文首先介绍WebRTC发送端NACK实现流程:

WebRTC QoS方法之视频发送端NACK实现_第4张图片

具体实现

重点流程有三步:

私信我,领取2022最新最全学习提升资料,内容包括(C/C++LinuxFFmpeg webRTC rtmp hls rtsp ffplay srs

WebRTC QoS方法之视频发送端NACK实现_第5张图片

 

1. 发送RTP报文,实时存储报文到packet_history_队列

ProcessThreadImpl::Process->PacedSender::Process    ->PacingController::ProcessPackets->PacketRouter::SendPacket->ModuleRtpRtcpImpl2::TrySendPacket->RtpSenderEgress::SendPacket

每次pacer发送报文的时候,都会把媒体报文储存在packet_history_队列。

WebRTC QoS方法之视频发送端NACK实现_第6张图片

RtpPacketHistory::PutRtpPacket以SequenceNumber为索引,把rtp保存在packet_history_队列。

WebRTC QoS方法之视频发送端NACK实现_第7张图片

SetStorePacketsStatus配置队列长度。

视频在CreateRtpStreamSenders->SetStorePacketsStatus配置。

WebRTC QoS方法之视频发送端NACK实现_第8张图片

音频在RegisterSenderCongestionControlObjects->SetStorePacketsStatus配置。

WebRTC QoS方法之视频发送端NACK实现_第9张图片

2. 处理接受到的RTCP NACK报文

函数调用关系如下:

WebRTC QoS方法之视频发送端NACK实现_第10张图片

RTCPReceiver::HandleNack

  • 压栈packet_information->nack_sequence_numbers丢包队列

WebRTC QoS方法之视频发送端NACK实现_第11张图片

ModuleRtpRtcpImpl::OnReceivedNack

  • 将RTT延时时间及nack_sequence_numbers队列更新到RTPSender::OnReceivedNack
  • WebRTC QoS方法之视频发送端NACK实现_第12张图片

3. 重发NACK反馈的RTP报文

RTPSender::OnReceivedNack

WebRTC QoS方法之视频发送端NACK实现_第13张图片

重发报文这里有3点需要注意:

1 )NackModule2::AddPacketsToNack:决定是否将该报文放入NACK队列。

WebRTC QoS方法之视频发送端NACK实现_第14张图片

 RtpPacketHistory::VerifyRtt 

WebRTC QoS方法之视频发送端NACK实现_第15张图片

2 )NACK重新发送媒体数据有两种方式:单独RTX通道发送、与媒体数据混在一起发送。

两种形式对单纯的NACK抗性影响不太大,但是与媒体数据混在一起发送模式,接收端无法区分是NACK重传报文,还是正常媒体数据,会导致接收端反馈的丢包率低于实际值,影响gcc探测码率,及发送端FEC冗余度配置。所以建议还是以RTX通道单独发送。

WebRTC QoS方法之视频发送端NACK实现_第16张图片

RTX通道单独发送重传报文,需要配置参数有如下三个:

3 )RTPSender::ReSendPacket在将重传数据加入pacer队列,会设置报文优先级,为了保证实时性,NACK重传报文需要按照高优先级重传。

优先级配置在set_packet_type,发送报文时,会根据kRetransmission获取发送优先级。

WebRTC QoS方法之视频发送端NACK实现_第17张图片

PacingController::EnqueuePacket

WebRTC QoS方法之视频发送端NACK实现_第18张图片

GetPriorityForType

WebRTC QoS方法之视频发送端NACK实现_第19张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(音视频开发进阶,音视频,视频编解码,实时音视频,webrtc,实时互动)