news 2026/6/9 7:59:22

webrtc neteq Nack_tracker重发(ARQ 的nack技术) 介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
webrtc neteq Nack_tracker重发(ARQ 的nack技术) 介绍

NackTracker 是 WebRTC NetEq 模块中用于跟踪丢失的 RTP 数据包并生成 NACK(Negative Acknowledgement,)列表的核心类。

它的主要目的是在网络状况不佳导致丢包时,通过请求发送端重传丢失的数据包来恢复音频质量,同时避免请求那些已经“过时”(即播放时间已过或即将到达,重传来不及)的数据包。

NackTracker 是一个智能的丢包跟踪器。它不仅仅是记录哪些包没收到,更重要的是基于时间的决策引擎。它通过实时估算每个丢失包的“剩余寿命”(距离播放还有多久),结合网络 RTT,动态决定哪些包值得重传(Missing),哪些包应该放弃(Late 或过期),从而在恢复音频质量和控制延迟/带宽之间取得平衡。

一、核心概念:Missing vs. Late

NackTracker将未到达的数据包分为两类:
• Late (迟到): 数据包虽然还没到,但预计在其播放时间之前还有可能到达。此时不请求重传,继续等待。
• Missing (丢失): 数据包不仅没到,而且根据当前的网络往返时间(RTT)估计,即使现在请求重传,在播放时刻之前也大概率无法到达;或者该包已经严重滞后,不再有价值。此时将其标记为 Missing,并加入 NACK 列表请求重传。

二, 关键成员

2.1, nack_list_ (NackList):

• 一个 std::map,Key 是 RTP 序列号,Value 是 NackElement。
• NackElement 包含:
• time_to_play_ms: 估计该包还需要多少毫秒才被播放。
• estimated_timestamp: 估计该包的 RTP 时间戳。
• is_missing: 标记该包是“丢失”还是“迟到”。

2.2, nack_threshold_packets_:

• 阈值。如果当前收到的最新包序列号为 ,那么序列号小于 且未收到的包被视为 Missing。序列号在 之间的未收到包被视为 Late。

2.3 max_nack_list_size_:

• NACK 列表的最大长度限制。防止内存无限增长,只保留最近的丢失包。

2.4 samples_per_packet_ & sample_rate_khz_:

• 用于计算每个包的持续时间,从而估算 time_to_play。

三,主要工作流程函数

3.1 初始化与重置

1, Create(int nack_threshold_packets): 工厂方法创建实例。
2, Reset(): 清空 NACK 列表。通常在切换编解码器或采样率变化时调用,因为旧的包重传已无意义。
3, UpdateSampleRate(int sample_rate_hz): 更新采样率,以便正确计算播放时间。

3.2 状态更新

1, UpdateLastReceivedPacket(seq, ts):
• 当一个新的 RTP 包从网络到达并插入 NetEq/ACM 时调用。
• 核心逻辑:
a. 检测序列号跳跃,识别中间缺失的包。
b. 调用 AddToList 将缺失包加入 nack_list_。
c. 调用 ChangeFromLateToMissing:检查之前的 "Late" 包,如果它们现在的序列号距离最新包超过了 nack_threshold,则转为 "Missing"。
d. 调用 LimitNackListSize:移除过旧的包。
2 , UpdateLastDecodedPacket(seq, ts):
• 当 NetEq 成功解码并输出 10ms 音频时调用。
• 核心逻辑:
a. 更新最后解码包的序列号和时间戳。
b. 调用 UpdateEstimatedPlayoutTimeBy10ms:将 nack_list_ 中所有包的 time_to_play_ms 减去 10ms。因为时间流逝了,剩余等待播放的时间变短了。

3.3,获取 NACK 列表

1, GetNackList(int64_t round_trip_time_ms):
• 这是上层(如 RtpRtcp 模块)调用的接口,用于获取需要请求重传的序列号列表。
• 筛选逻辑:
a. 遍历 nack_list_。
b. 只选择 is_missing == true 的包。
c. 进一步筛选:只有当 time_to_play_ms > round_trip_time_ms 时才加入列表。
• 原因: 如果剩余播放时间小于 RTT,说明即使现在立刻请求重传,包也会在播放时刻之后才到达,因此请求重传是无效的,甚至浪费带宽。

四,辅助函数

1, EstimateTimestamp(seq):

根据已知包的时间戳和序列号差值,线性推算丢失包的时间戳。

2, TimeToPlay(timestamp):

根据当前解码进度和包的时间戳,计算该包距离被播放还有多少毫秒。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 7:58:07

WPS表格转换踩坑实录:为什么你的逗号分隔文本总转不对?

WPS表格转换踩坑实录:为什么你的逗号分隔文本总转不对?第一次尝试将逗号分隔的客户名单转换成表格时,屏幕上的结果让我愣住了——所有内容都挤在同一个单元格里,完全不是我预期的整齐分列。这种挫败感,相信很多办公族都…

作者头像 李华
网站建设 2026/6/9 7:58:02

OpenTelemetry Collector 实现协议熔断与动态采样

发散创新:用 OpenTelemetry Collector 实现可观测性标准的“协议熔断”与动态采样治理 在微服务架构深度演进的今天,可观测性已不再是“锦上添花”,而是系统韧性的基础设施级要求。但现实困境是:OpenTelemetry (OTel) 作为 CNCF 毕…

作者头像 李华
网站建设 2026/6/9 7:57:02

2026 Python开发新范式:AI系统工程与DevOps原生性融合

1. 项目概述:当Python开发不再只是写代码,而是一场系统级协同进化2026年的Python开发者,正站在一个微妙的临界点上。你可能刚用Copilot补全了一段Pandas数据清洗逻辑,转头就要在CI流水线里调试Kubernetes的HPA(Horizon…

作者头像 李华
网站建设 2026/6/9 7:56:22

耐酸碱玻璃钢储罐制造厂正规厂家推荐

在化工车间,一个不争的事实是:腐蚀是设备的“头号杀手”。尤其是储存强酸、强碱等腐蚀性介质的储罐,一旦出现渗漏,不仅意味着约20万元的直接物料损失,更可能引发环境污染和停产整顿。当传统碳钢储罐用不到3年便开始锈蚀…

作者头像 李华
网站建设 2026/6/9 7:55:15

AD板子进SW后别急着建模:先搞定STEP导入报错和贴图变形

AD转SW实战避坑指南:彻底解决STEP导入报错与贴图变形问题当你从Altium Designer(AD)导出PCB设计到SOLIDWORKS(SW)进行机械建模时,是否经常被这两个问题困扰:STEP文件导入时不断弹出的模板设置警告,或者费尽心思贴上去的丝印图案莫…

作者头像 李华
网站建设 2026/6/9 7:53:58

全流程线上智能管理后台,178软文网GEO代运营赋能企业透明化管控传播

数字化后台系统是实现软文与GEO代运营透明化管理的重要载体,178软文网自主研发一站式智能管理系统,打通下单、撰稿、选媒、发布、查链、数据查看全线上链路,企业客户随时随地登录后台,即可全流程管控自身传播项目,实现消费透明、进度可视、数据可查,数字化赋能品牌营销精细化管…

作者头像 李华