webrtc码率设置的函数调用

 基于版本branch-headers-78,列出webrtc的码率设置的主要函数调用过程。我最新的博客-webrtc的视频数据处理流程分析有更详细的分析。

kPacerQueueUpdateInterval  25ms更新一次
//https://github.com/pixiv/webrtc/blob/branch-heads/pixiv-m78/call/rtp_transport_controller_send.cc#L521
void RtpTransportControllerSend::StartProcessPeriodicTasks() {
  if (!pacer_queue_update_task_.Running()) {
    pacer_queue_update_task_ = RepeatingTaskHandle::DelayedStart(
        task_queue_.Get(), kPacerQueueUpdateInterval, [this]() {
          RTC_DCHECK_RUN_ON(&task_queue_);
          TimeDelta expected_queue_time = pacer()->ExpectedQueueTime();
          control_handler_->SetPacerQueue(expected_queue_time);
          UpdateControlState();
          return kPacerQueueUpdateInterval;
        });
  }
  controller_task_.Stop();
  if (process_interval_.IsFinite()) {
    controller_task_ = RepeatingTaskHandle::DelayedStart(
        task_queue_.Get(), process_interval_, [this]() {
          RTC_DCHECK_RUN_ON(&task_queue_);
          UpdateControllerWithTimeInterval();
          return process_interval_;
        });
  }
}
void RtpTransportControllerSend::UpdateControlState() {
  absl::optional<TargetTransferRate> update = control_handler_->GetUpdate();
  if (!update)
    return;
  retransmission_rate_limiter_.SetMaxRate(
      update->network_estimate.bandwidth.bps());
  // We won't create control_handler_ until we have an observers.
  RTC_DCHECK(observer_ != nullptr);
  observer_->OnTargetTransferRate(*update);
}
void Call::OnTargetTransferRate(TargetTransferRate msg) {
  bitrate_allocator_->OnNetworkChanged(
      target_bitrate_bps, stable_target_rate_bps, bandwidth_bps, fraction_loss,
      rtt_ms, probing_interval_ms);
}
//https://github.com/pixiv/webrtc/blob/branch-heads/pixiv-m78/call/bitrate_allocator.cc#L97
void BitrateAllocator::OnNetworkChanged(uint32_t target_bitrate_bps,
                                        uint32_t stable_target_bitrate_bps,
                                        uint32_t bandwidth_bps,
                                        uint8_t fraction_loss,
                                        int64_t rtt,
                                        int64_t bwe_period_ms)
{
    uint32_t protection_bitrate = config.observer->OnBitrateUpdated(update);  
}                                        
uint32_t VideoSendStreamImpl::OnBitrateUpdated(BitrateAllocationUpdate update) {
  RTC_DCHECK_RUN_ON(worker_queue_);
  RTC_DCHECK(rtp_video_sender_->IsActive())
      << "VideoSendStream::Start has not been called.";

  // When the BWE algorithm doesn't pass a stable estimate, we'll use the
  // unstable one instead.
  if (update.stable_target_bitrate.IsZero()) {
    update.stable_target_bitrate = update.target_bitrate;
  }

  rtp_video_sender_->OnBitrateUpdated(update, stats_proxy_->GetSendFrameRate());
  encoder_target_rate_bps_ = rtp_video_sender_->GetPayloadBitrateBps();
  const uint32_t protection_bitrate_bps =
      rtp_video_sender_->GetProtectionBitrateBps();
  DataRate link_allocation = DataRate::Zero();
  if (encoder_target_rate_bps_ > protection_bitrate_bps) {
    link_allocation =
        DataRate::BitsPerSec(encoder_target_rate_bps_ - protection_bitrate_bps);
  }
  DataRate overhead =
      update.target_bitrate - DataRate::BitsPerSec(encoder_target_rate_bps_);
  DataRate encoder_stable_target_rate = update.stable_target_bitrate;
  if (encoder_stable_target_rate > overhead) {
    encoder_stable_target_rate = encoder_stable_target_rate - overhead;
  } else {
    encoder_stable_target_rate = DataRate::BitsPerSec(encoder_target_rate_bps_);
  }

  encoder_target_rate_bps_ =
      std::min(encoder_max_bitrate_bps_, encoder_target_rate_bps_);

  encoder_stable_target_rate =
      std::min(DataRate::BitsPerSec(encoder_max_bitrate_bps_),
               encoder_stable_target_rate);

  DataRate encoder_target_rate = DataRate::BitsPerSec(encoder_target_rate_bps_);
  link_allocation = std::max(encoder_target_rate, link_allocation);
  video_stream_encoder_->OnBitrateUpdated(
      encoder_target_rate, encoder_stable_target_rate, link_allocation,
      rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256),
      update.round_trip_time.ms(), update.cwnd_reduce_ratio);
  stats_proxy_->OnSetEncoderTargetRate(encoder_target_rate_bps_);
  return protection_bitrate_bps;
}

 而调整编码器的码率,可以通过两种方式实现,丢帧和重置编码器速率:

DataRate VideoStreamEncoder::UpdateTargetBitrate(DataRate target_bitrate,
                                                 double cwnd_reduce_ratio) {
  RTC_DCHECK_RUN_ON(&encoder_queue_);
  DataRate updated_target_bitrate = target_bitrate;

  // Drop frames when congestion window pushback ratio is larger than 1
  // percent and target bitrate is larger than codec min bitrate.
  // When target_bitrate is 0 means codec is paused, skip frame dropping.
  if (cwnd_reduce_ratio > 0.01 && target_bitrate.bps() > 0 &&
      target_bitrate.bps() > send_codec_.minBitrate * 1000) {
    int reduce_bitrate_bps = std::min(
        static_cast<int>(target_bitrate.bps() * cwnd_reduce_ratio),
        static_cast<int>(target_bitrate.bps() - send_codec_.minBitrate * 1000));
    if (reduce_bitrate_bps > 0) {
      // At maximum the congestion window can drop 1/2 frames.
      cwnd_frame_drop_interval_ = std::max(
          2, static_cast<int>(target_bitrate.bps() / reduce_bitrate_bps));
      // Reduce target bitrate accordingly.
      updated_target_bitrate =
          target_bitrate - (target_bitrate / cwnd_frame_drop_interval_.value());
      return updated_target_bitrate;
    }
  }
  cwnd_frame_drop_interval_.reset();
  return updated_target_bitrate;
}

 通过丢帧的方式降低码率, 代码注释的很清楚,是由于限定条件的。要设置的目标码率,依然大于当前编码器配置(图像的长宽)的最下速率。

[1]webrtc视频帧率控制算法机制(一)–目标码率丢帧

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
通过更改Chrome的隐私设置来配置WebRTC的网络流量。 在Chrome的隐私设置中配置WebRTC流量路由选项。 ★它做什么: 这配置WebRTC不使用某些IP地址或协议: - 公共互联网不可见的私人IP地址(例如地址192.168.1.2) - 与不用于网络流量的网络接口相关联的任何公共IP地址(例如,当通过VPN浏览时,ISP提供的地址) - 要求WebRTC流量通过Chrome中配置的代理服务器。由于大多数代理服务器不处理UDP,所以这会有效地关闭UDP,直到Chrome中提供UDP代理支持,并且这些代理被广泛部署。   当扩展程序安装在M48之前的Chrome版本上时,WebRTC将仅使用与用于Web通信的接口关联的公共IP地址,通常是已经提供给浏览器HTTP请求中的站点的相同地址。对于Chrome版本M48以及之后的版本,此扩展提供了一个允许WebRTC使用默认公共地址的配置,对于NAT后面的机器,则使用与公共地址关联的默认私有地址。在Chrome M48的全新安装扩展之后,所述行为将是默认的。对于升级方案,以前选择的配置不应该改变。 该扩展也可能会禁用非代理UDP,但默认情况下不会启用,并且必须使用扩展的“选项”页面进行配置。 ★注意事项: 此扩展可能会影响使用WebRTC进行音频/视频或实时数据通信的应用程序的性能。因为它限制了潜在的网络路径和协议,所以WebRTC可能选择导致明显更长的延迟或更低质量(例如,通过VPN)的路径,或者仅通过代理服务器使用TCP,这对于实时通信不是理想的。我们正试图确定这是多么普遍。 安装此项目即表示您同意Google服务条款和隐私权政策,网址为https://www.google.com/intl/zh-CN/policies/。 支持语言:English

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值