WebRTC的Pacing

该文讨论了一种匀速发送RTP数据的机制,主要应用于视频传输。PacingController负责根据优先级(音频最高,然后是重传包和视频,最后是填充包)来处理数据包。在ProcessPackets函数中,系统会检查队列和预算,按需发送I帧、P帧或填充包,并确保符合带宽限制。PacketRouter模块则处理实际的包发送,包括设置TransportSequenceNumber扩展。
摘要由CSDN通过智能技术生成

一  类图

二 主要函数

作用:匀速发送数据,主要是视频。I帧和P帧的大小不一样,I帧拆分的RTP包多些,匀速发送。

void PacingController::EnqueuePacket(std::unique_ptr<RtpPacketToSend> packet) {
  //优先级: audio最高, 重发的包, video, padding.
  const int priority = GetPriorityForType(*packet->packet_type());
  EnqueuePacketInternal(std::move(packet), priority);
}


void PacedSender::Process() {
  MutexLock lock(&mutex_);
  pacing_controller_.ProcessPackets();
}

//有周期和动态两种方式, 默认周期kPeriodic.
//constexpr TimeDelta kDefaultMinPacketLimit = TimeDelta::Millis(5);
void PacingController::ProcessPackets() {

...

// Fetch the next packet, so long as queue is not empty or budget is not
// exhausted.
1   std::unique_ptr<RtpPacketToSend> rtp_packet =
    GetPendingPacket(pacing_info, target_send_time, now);
    if (rtp_packet == nullptr) {
      // No packet available to send, check if we should send padding.
      ...
    }

2 packet_sender_->SendPacket(std::move(rtp_packet), pacing_info);

}

void PacketRouter::SendPacket(std::unique_ptr<RtpPacketToSend> packet,
                              const PacedPacketInfo& cluster_info) {

 ...
 if (packet->HasExtension<TransportSequenceNumber>()) {
    packet->SetExtension<TransportSequenceNumber>((++transport_seq_) & 0xFFFF);
  }

  ...
  ModuleRtpRtcpImpl2::TrySendPacket(...)
}

IntervalBudget media_budget_; //限制发送的带宽
IntervalBudget padding_budget_;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值