WebRTC 的音频弱网对抗之 NACK
基础知识
音频的 NACK 机制在 WebRTC 中默认是关闭的.
rtcp feedbacknack开启就可以了
WebRTC 的音频数据传输中,尽管对低延时有着很高的要求,但也实现了 NACK,以用于一些音质比延迟更重要的场景。
重传数据包的记录功能, 记录那些需要重传
nack_tracker.cc
在 WebRTC 里,NetEQ 的 webrtc::NackTracker 用来跟踪和记录可能需要请求重传的数据包。
typedef std::map<uint16_t, NackElement, NackListCompare> NackList;
//NackList记录了丢包的序列号和每个包的播放时间和timestamp
struct NackElement {
NackElement()
int64_t time_to_play_ms; //此数据包解码的估计剩余时间(毫秒)
uint32_t estimated_timestamp;//关于丢失数据包的时间戳的猜测
bool is_missing; //判定是丢包还是,延迟了
};
小于最新收到的, 才可能是丢包
更新最后接收到的包NackTracker::UpdateLastReceivedPacket
- 从 NACK 列表中移除对应数据包序列号的记录
- 如果新收到的数据包的序列号比收到的最近的数据包的序列号小, 收到了丢包; 否则更新NACK 列表
- 计算收到的最近的数据包到这次收到的数据包之间还没有收到的数据包的个数,并据此计算丢包率;
- 更新NACK 列表
- 更新记录收到的最近的数据包的序列号和 timestamp;
- 执行 NACK 列表大小限制。
更新最近一次解码成功, NackTracker::UpdateLastDecodedPacket
接收端寻找时机发送 NACK 消息
WebRTC 在每次收到音频数据包,并把它送进 NetEQ 之后,就会立即去获取 NACK 列表
ChannelReceive::OnReceivedPayloadData
webrtc::voe::ChannelReceive::OnReceivedPayloadData()
NackTracker::GetNackList
ModuleRtpRtcpImpl::SendNack
//5 + RTT * 1.5. 来区别NACK下次时间
接收端开启音频 NACK
webrtc::internal::AudioReceiveStream 对象创建时,有个配置项 config.rtp.nack.rtp_history_ms 用于控制是否开启 NACK。
config.rtp.nack.rtp_history_ms 的值大于 0 时,开启 NACK,否则不开启。
config.rtp.nack.rtp_history_ms 的值根据 WebRtcVoiceEngine 的 recv_nack_enabled_ 配置计算得到,而这个配置则来自于 codec spec 的 nack_enabled,codec spec 的配置来自于接收和发送的两方协调的 codec 配置的 SDP 消息
FeedbackParam(kRtcpFbParamNack, kParamValueEmpty));
发送端缓存
webrtc::RtpPacketHistory //发送的时候存储在该对象
发送端接收并处理 RTCP NACK 反馈包
webrtc::RTCPReceiver::IncomingPacket
webrtc::ModuleRtpRtcpImpl2::IncomingRtcpPacket
webrtc::voe::ChannelSend::ReceivedRTCPPacket(unsigned char const*, unsigned long)
webrtc::internal::AudioSendStream::DeliverRtcp(unsigned char const*, unsigned long)
webrtc::internal::Call::DeliverRtcp(webrtc::MediaType, rtc::CopyOnWriteBuffer):

蓝色箭头和红色方框中的这些逻辑是 NACK 数据包处理过程中,不同于一般采集、编码及发送流程的地方。
WebRTC 的音频弱网对抗之 NACK的更多相关文章
- 阿里云 RTC QoS 弱网对抗之 LTR 及其硬件解码支持
LTR 弱网对抗由于需要解码器的反馈,因此用硬件解码器实现时需要做一些特殊处理.另外,一些硬件解码器对 LTR 的实现不是特别完善,会导致出现解码错误.本文为 QoS 弱网优化系列的第三篇,将为您详解 ...
- 网络QoS的平衡之道——音视频弱网对抗策略介绍
作者:网易智企云信资深音视频引擎开发工程师 王兴鹤 随着AI和5G的到来,音视频应用将变得越来越广泛,人们对音视频的品质需求也越来越高,视频分辨率已经从高清发展为超高清.VR,视频帧率也已出现60fp ...
- 阿里云 RTC QoS 弱网对抗之变分辨率编码
本文为 QoS 弱网优化系列的第二篇 作者|安基程.田伟峰 审校| 泰一 视频编码中的变分辨率问题及解决 变分辨率在弱网场景的实际应用中非常常见,网络状况不好的时候降低分辨率可以降低码率,减少块效应, ...
- 单独编译使用WebRTC的音频处理模块
块,每块个点,(12*64=768采样)即AEC-PC仅能处理48ms的单声道16kHz延迟的数据,而 - 加载编译好的NS模块动态库 接下来只需要按照 此文 的描述在 android 的JAVA代码 ...
- 直播推流端弱网优化策略 | 直播 SDK 性能优化实践
弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...
- 弱网测试IOS
IOS测弱网非常方便,在设置-开发者-NETWORK LINK CONDITIONER的Status 进入后可以看到IOS自带了100%LOSS.3G.WiFi等常见场景 可以点击图标i进行查看或编辑 ...
- 弱网测试Android
弱网测试一般是指模拟在网络环境比较差的情况下,检测APP是否有异常,如崩溃,数据收发出现丢包的情况 一.首先需要控制网络,有两种方式其一使用网络损伤仪进行,其二采用软件方式.硬件采购费用太贵,因此使用 ...
- iOS如何监听弱网?
场景: iOS中我们可能经常用到监听网络,不过大部分是监听网络的类型,即2G/3G/4G WIFI,是否连接网络,然而测试人员对APP进行测试时候经常会有一个弱网测试,即在弱网环境下对APP进行测试, ...
- APP弱网测试
APP弱网测试 App弱网测试方法,常用工具有使用fiddler进行网络模拟,也可以使用Network Emulator Toolkit控制模拟网络,相对来说Network Emulator To ...
- Android弱网测试中关于网络检测的一些借鉴方法
Android 平台下提供了一个android.net.ConnectivityManager类来监控当前的网络状态包括wifi.gprs.UMTS等.可以判断当前用户网络到底是WIFI还是移动网络, ...
随机推荐
- 代码随想录算法训练营day14 | leetcode 层序遍历 226.翻转二叉树 101.对称二叉树 2
层序遍历 /** * 二叉树的层序遍历 */ class QueueTraverse { /** * 存放一层一层的数据 */ public List<List<Integer>&g ...
- 好消息!微信小程序开发环境自带vConsole
背景介绍 事情是这样子的,我们在开发小程序的时候,需要在真机上把相关的日志打出来以便进行问题定位和回溯,于是在编程界就有个今天这个新闻.------ 好消息!广东某男子发现微信小程序开发环境自带vCo ...
- PostgreSQL维护年龄的处理
1.错误信息 WARNING: database "postgres" must be vacuumed within 3330803 transactions 最常见的方法是通过 ...
- ThreadLocal及常用场景
ThreadLocal ThreadLocal是Java中的为解决多线程间数据隔离的解决方案,其底层依赖于Java的内存模型,依赖于当前执行线程的内存来完成对数据的存取操作. 一般在使用时,在对象中创 ...
- Linux改密码失败authentication token manipulation error 的处理办法
给root改密码时提示:passwd authentication token manipulation error 代表一是有可能是磁盘存储不足了,另一个原因是因为密码文件被赋予了特殊权限,不可被修 ...
- Linux常用命令 转于WoW_Boom
一.常用命令 1.进入到用户根目录cd ~ 或 cd 2.查看当前所在目录pwd 3.进入到itcast用户根目录cd ~itcast 4.返回到原来目录cd - 5.返回到上一级目录cd .. 6. ...
- Hanlp 在Python环境中安装、介绍及使用
Hanlp HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用.HanLP具备功能完善.性能高效.架构清晰.语料时新.可自定义的特点. 功能:中文分词 词性标 ...
- Linux编辑器
Vim 安装: yum install vim $ vim test.cnf --打开文件 命令模式: i --切换到输入模式,以输入字符 : --切换到底线命令模式,以在最底一行输入命令 输入 ...
- 【面试题】JS 中这些继承方式你知道吗?
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 29 天,点击查看活动详情 问题描述 继承 是基于面向对象的,使用 继承 可以让我们更好的复用以前开发的代码,缩短开发的周期.提 ...
- Vuex 部分
Vuex 部分 官网链接 https://vuex.vuejs.org/zh/ 先说一下vuex到底是什么? vuex 是一个专门为vue.js应用程序开发的状态管理模式. 这个状态我们可以理解为在d ...