webrtc源码分析 nack详解
2022/3/3 20:17:43
本文主要是介绍webrtc源码分析 nack详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、Nack过程
1.1 nack是什么
丢包重传(NACK)是抵抗网络错误的重要手段。NACK在接收端检测到数据丢包后,发送NACK报文到发送端;发送端根据NACK报文中的序列号,在发送缓冲区找到对应的数据包,重新发送到接收端。NACK需要发送端,发送缓冲区的支持。
1.2 nack流程
发送端发送rtp,到达接收端时,发现丢包,接收端发送nack请求,发送端会从历史队列中取出数据重发。
2、Nack协议实现
2.1 rfc协议
在rfc4585协议中定义可重传未到达数据的类型有二种:
1)RTPFB:rtp报文丢失重传(nack)。
2)PSFB:指定净荷重传,指定净荷重传里面又分如下三种(关键帧请求):
1、PLI (Picture Loss Indication) 视频帧丢失重传。
2、SLI (Slice Loss Indication) slice丢失重转。
3、RPSI (Reference Picture Selection Indication)参考帧丢失重传。
在创建视频连接的SDP协议里面,会协商以上述哪种类型进行NACK重转。以webrtc为例,会协商两种NACK,一个rtp报文丢包重传的nack(nack后面不带参数,默认RTPFB)、PLI 视频帧丢失重传的nack。
rtcp包格式
nack rtcp报文格式如上图所示,pt=205。Packet identifier(PID) 为丢包起始参考值,Bitmap of Lost Packets(BLP)为16位的bitmap,对应为1的为表示丢包数据,具体如下抓包分析:
Packet identifier(PID)为176。Bitmap of Lost Packets(BLP):0x6ae1。解析的时候需要按照小模式解析,0x6ae1对应二进制:110101011100001倒过来看1000 0111 0101 0110。按照1bit是丢包,0bit是没有丢包解析,丢失报文序列号分别是:176 177 182 183 184 186 188 190 191与wireshark解析一致,当然pid和blp可以有多个。
1、发送流程
1.1 数据流
以视频为例
1.2 调用堆栈
H264EncoderImpl::Encode VideoStreamEncoder::OnEncodedImage VideoSendStreamImpl::OnEncodedImage RtpVideoSender::OnEncodedImage RTPSenderVideo::SendEncodedImage RTPSenderVideo::SendVideo RTPSenderVideo::LogAndSendToNetwork RTPSender::EnqueuePackets pacer // RtpSenderEgress::SendPacket //放入队列 RtpPacketHistory::PutRtpPacket
1.3 RtpSenderContext 结构体
modules/rtp_rtcp/source/rtp_rtcp_impl2.h
struct RtpSenderContext { explicit RtpSenderContext(const RtpRtcpInterface::Configuration& config); // Storage of packets, for retransmissions and padding, if applicable. RtpPacketHistory packet_history; SequenceChecker sequencing_checker; // Handles sequence number assignment and padding timestamp generation. PacketSequencer sequencer RTC_GUARDED_BY(sequencing_checker); // Handles final time timestamping/stats/etc and handover to Transport. RtpSenderEgress packet_sender; // If no paced sender configured, this class will be used to pass packets // from `packet_generator_` to `packet_sender_`. RtpSenderEgress::NonPacedPacketSender non_paced_sender; // Handles creation of RTP packets to be sent. RTPSender packet_generator; };
2、视频Nack过程
视频nack请求
视频nack响应
3、音频Nack请求
音频nack请求
音频nack响应
4、视频FIR/PLI
视频关键帧请求
视频关键帧响应
这篇关于webrtc源码分析 nack详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享