WebRTC QoS方法之视频发送端NACK实现

概念简介

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

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

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

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

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

具体实现

重点流程有三步:

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebRTC(Web Real-Time Communication)是一个开放标准的实时通信技术,可以在浏览器之间直接立音视频通信,无需任插件或额外的软件。要WebRTC实现视频聊天,你可以WebRTC提供的Web API。 以下是一些实现视频聊天的基本步骤: 1. 获取用户媒体设备:使用`getUserMedia`方法获取用户的音视频流。这个方法会请求用户授权访问摄像头和麦克风。 2. 建立Peer Connection:使用`RTCPeerConnection`对象来建立两个浏览器之间的连接。这个对象负责建立和管理音视频传输通道。 3. 信令传输:为了建立Peer Connection,你需要一个信令服务器来传递连接所需的信息。你可以使用WebSocket或者其他实时通信方式来传输信令。 4. 连接建立和ICE候选者收集:一旦Peer Connection建立,浏览器会开始收集ICE(Interactive Connectivity Establishment)候选者,这些候选者用于在两个浏览器之间建立点对点连接。 5. 建立数据通道:如果你需要在视频聊天中传输其他数据(如文本消息),你可以使用`RTCDataChannel`对象来创建一个可靠的双向数据通道。 6. 媒体流传输:通过Peer Connection的音视频传输通道,你可以将用户的音视频流进行传输和呈现。 注意,以上只是基本的步骤概述,实际的实现可能还涉及到一些其他的细节和处理逻辑。你可以参考WebRTC官方文档以及一些开源的WebRTC库和示例代码来更详细地了解和实现视频聊天功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值