导语 | 本文为大家详细解读一下WebRTC中视频发送端NACK的实现。文章中引用的WebRTC代码基于master,commit:f412945f05ce1ac372a7dad77d85498d23deaae源码分析。
概念简介
与NACK对应的是ACK,ACK是到达通知技术。以TCP为例,他可靠因为接收方在收到数据后会给发送方返回一个“已收到数据”的消息(ACK),告诉发送方“我已经收到了”,确保消息的可靠。
NACK也是一种通知技术,只是触发通知的条件刚好的ACK相反,在未收到消息时,通知发送方“我未收到消息”,即通知未达。
在rfc4585协议中定义可重传未到达数据的类型有二种:
目前大家普遍使用RTP报文丢失重传,这种方式恢复周期短,相对于另外三种,对带宽影响小。
本文首先介绍WebRTC发送端NACK实现流程:
具体实现重点流程有三步:
1. 发送RTP报文,实时存储报文到packet_history_队列
ProcessThreadImpl::Process->PacedSender::Process
->PacingController::ProcessPackets
->PacketRouter::SendPacket
->ModuleRtpRtcpImpl2::TrySendPacket
->RtpSenderEgress::SendPacket
每次pacer发送报文的时候,都会把媒体报文储存在packet_history_队列。
RtpPacketHistory::PutRtpPacket以SequenceNumber为索引,把rtp保存在packet_history_队列。
SetStorePacketsStatus配置队列长度。视频在CreateRtpStreamSenders->SetStorePacketsStatus配置。
音频在RegisterSenderCongestionControlObjects->SetStorePacketsStatus配置。
2. 处理接受到的RTCP NACK报文
函数调用关系如下:
RTCPReceiver::HandleNack
- 压栈packet_information->nack_sequence_numbers丢包队列
ModuleRtpRtcpImpl::OnReceivedNack
- 将RTT延时时间及nack_sequence_numbers队列更新到RTPSender::OnReceivedNack
来源公众号:腾讯云音视频
链接:https://mp.weixin.qq.com/s/Xf1x_bL2_N6F3hCUJm-rgw
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。