首页 > 其他分享 >WebRTC 的音频弱网对抗之 NACK

WebRTC 的音频弱网对抗之 NACK

时间:2022-12-22 09:55:54浏览次数:39  
标签:弱网 NACK webrtc rtp nack 数据包 WebRTC

基础知识

音频的 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 数据包处理过程中,不同于一般采集、编码及发送流程的地方。

标签:弱网,NACK,webrtc,rtp,nack,数据包,WebRTC
From: https://www.cnblogs.com/WillingCPP/p/16997560.html

相关文章

  • 弱网络环境下,网络性能优化
    1、采用TCP协议、实现长连接2、采用长连接池,节省握手时间3、采用ProtocolBuffer,减少冗余数据(相比xml)4、弃用DNS,直接使用IP,减少了请求DNS服务查询IP的时间,避......
  • win10 hyper-v 安装 基于Janus的webRTC环境
    一、安装webRTC环境的准备工作1.centos下载位置:​​https://mirrors.openanolis.cn/anolis/8.4/isos/GA/x86_64/​​ 2.win10没有hyper 解决办法:​​【转】windows没......
  • 高性能 Jsonpath 框架,Snack3 3.2.50 发布
    Snack3,一个高性能的JsonPath框架借鉴了Javascript所有变量由var申明,及Xmldom一切都是Node的设计。其下一切数据都以ONode表示,ONode也即Onenode之意,代表任何......
  • 通过WebRTC 的 RTSP 视频获取
    背景由于项目需要,需要使用摄像头在Web页面上展现,由于海康威视摄像头推出的流为rtsp流,已知存在的基于FFmpeg的方案延迟都太高,所以就项目最终选择基于此方案。方案说明webr......
  • 弱网测试工具 Clumsy
    弱网测试工具Clumsy来源https://www.jianshu.com/p/13321b39d513 clumsy能在Windows平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现......
  • OpenWRT + tc/netem 搭建弱网环境
    OpenWRT+tc/netem搭建弱网环境来源 http://lcodecorex.github.io/2016/11/10/%E6%9E%81%E5%A3%B9%20+%20OpenWRT%20+%20tc:netem%20%E6%90%AD%E5%BB%BA%E5%BC%B1%E7%B......
  • centos7上安装coturn搭建turn/stun服务-WebRTC
    coturn是一个免费的开源的TURN/STUN服务器。coturn服务器完整的实现了STUN/TURN/ICE协议,支持P2P穿透防火墙。1.STUN服务器用于获取设备的外部网络地址。2.TURN服务器是在......
  • js获取内(外)网真实IP地址(WebRTC)及内网端口扫描
    摘要:使用的属性来发送数据内容接受的地址接受内网的参数接受内网开放端口的参数如果想获取真实的外网,请把下一行改为遍历内网及端口,这里只写了端口,多个端口,速度将会的非常......
  • 调用第三方接口实现呼叫台功能 -WebRTC
    调用第三方接口实现呼叫台功能WebRTCWebRTC学习笔记——建立连接-简书(jianshu.com)(4条消息)webRTC(八):查看offer/answer的SDP_晓果博客的博客-CSDN博客(4条消息)......
  • WebRTC 从实战到未来!前端如何实现一个最简单的音视频通话?
    作者:​​荣顶​​ ​​......