前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WebRTC系列分享 第三期 | WebRTC QoS方法之视频发送端NACK实现

WebRTC系列分享 第三期 | WebRTC QoS方法之视频发送端NACK实现

作者头像
腾讯云音视频
修改2022-04-13 10:58:20
9180
修改2022-04-13 10:58:20
举报
文章被收录于专栏:音视频咖音视频咖

导语 | 本文为大家详细解读一下WebRTC中视频发送端NACK的实现。文章中引用的WebRTC代码基于master,commit:f412945f05ce1ac372a7dad77d85498d23deaae源码分析。

概念简介

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

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

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

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

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

具体实现

重点流程有三步:

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

代码语言:javascript
复制
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

3. 重发NACK反馈的RTP报文

RTPSender::OnReceivedNack

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

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

RtpPacketHistory::VerifyRtt 

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

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

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

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

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

PacingController::EnqueuePacket

GetPriorityForType

关于云架构平台部

云架构平台部是腾讯规模最大的技术部门之一,长期深耕音视频、存储、接入和计算服务等技术领域,通过海量的存储和数据库平台,世界级的CDN&音视频服务,先进的操作系统和视频编解码技术,助力腾讯云以技术的力量持续赋能客户,帮他们提升效率,降低成本。

腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONE™ 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云音视频 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 重点流程有三步:
  • 1. 发送RTP报文,实时存储报文到packet_history_队列
  • 2. 处理接受到的RTCP NACK报文
  • 3. 重发NACK反馈的RTP报文
相关产品与服务
内容分发网络 CDN
内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档