剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. WebRTC
  3. 正文

WebRTC研究:带宽估计中的稳定估计值

2020年8月12日 971点热度 4人点赞 0条评论

WebRTC带宽估计后,得到的结果会存到TargetTransferRate结构体中,然后回调给上层。TargetTransferRate定义如下:

1
2
3
4
5
6
7
struct TargetTransferRate {
  Timestamp at_time = Timestamp::PlusInfinity();
  // The estimate on which the target rate is based on.
  NetworkEstimate network_estimate;
  DataRate target_rate = DataRate::Zero();
  DataRate stable_target_rate = DataRate::Zero();
};

可以看到该结构体有两个估计码率值,本文我们介绍下其中的stable_target_rate,该值在后续的码率分配中有用到,配合target_rate进行相关判断。

在GoogCcNetworkController中,TargetTransferRate结果值按如下得到:

1
2
3
4
5
TargetTransferRate target_rate_msg;
target_rate_msg.target_rate = pushback_target_rate;
target_rate_msg.stable_target_rate =
    std::min(bandwidth_estimation_->GetEstimatedLinkCapacity(),
             pushback_target_rate);

其中pushback_target_rate为我们实际的带宽估计值,stable_target_rate取带宽估计值与EstimatedLinkCapacity小的一个。

SendSideBandwidthEstimation

如下代码可知,LinkCapacity通过LinkCapacityTracker(link_capacity_)计算得到,接下来我们看看这个LinkCapacityTracker究竟是什么东东。

1
2
3
DataRate SendSideBandwidthEstimation::GetEstimatedLinkCapacity() const {
  return link_capacity_.estimate();
}

LinkCapacityTracker

LinkCapacityTracker类比较简单,接口不多,这里我们介绍下主要的两个接口,通过这两个接口进行LinkCapacity的更新。

UpdateDelayBasedEstimate

主要两个输入参数如下:

  • at_time: 当前时间
  • delay_based_bitrate:当前基于时延的带宽估计值

这里我们分析下该函数代码:

1
2
3
4
5
6
7
8
9
10
11
12
// 得到一个新的基于时延的带宽估计值:delay_based_bitrate后触发
void LinkCapacityTracker::UpdateDelayBasedEstimate(
    Timestamp at_time,
    DataRate delay_based_bitrate) {
  if (delay_based_bitrate < last_delay_based_estimate_) {
    // 若比之前估计值小,取capacity_estimate_bps_与当前基于时延估计值小的一个
    capacity_estimate_bps_ =
        std::min(capacity_estimate_bps_, delay_based_bitrate.bps<double>());
    last_link_capacity_update_ = at_time;
  }
  last_delay_based_estimate_ = delay_based_bitrate;
}

OnRateUpdate

主要有如下三个输入参数:

  • acknowledged:根据接收端反馈的信息计算的接收码率(通过Transport-CC报文,该报文详细分析可去我博客搜索下)
  • target:当前综合时延以及丢包信息得到的带宽估计值
  • at_time:当前时间

该函数具体分析如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 得到一个新的综合时延以及丢包的带宽估计值target后触发
void LinkCapacityTracker::OnRateUpdate(absl::optional<DataRate> acknowledged,
                                       DataRate target,
                                       Timestamp at_time) {
  if (!acknowledged)
    return;
  // 取带宽估计值以及实际接收码率小的,追求保守
  DataRate acknowledged_target = std::min(*acknowledged, target);
  if (acknowledged_target.bps() > capacity_estimate_bps_) {
    TimeDelta delta = at_time - last_link_capacity_update_;
    double alpha = delta.IsFinite() ? exp(-(delta / tracking_rate.Get())) : 0;
    // 使用滑动平均进行数据平滑处理
    capacity_estimate_bps_ = alpha * capacity_estimate_bps_ +
                             (1 - alpha) * acknowledged_target.bps<double>();
  }
  last_link_capacity_update_ = at_time;
}

通过前面两个函数,得到的capacity_estimate_bps_即为我们前面说的稳定估计值stable_target_rate。由前面分析可知,该stable_target_rate综合了当前带宽估计值以及实际接收码率,从计算过程可知比较保守。从实际测试效果看,该估计值也正如其名,相对实际带宽估计值target_rate会更平稳,值也会相对小些。

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: WebRTC
最后更新:2021年5月25日

Jeff

管理员——代码为剑,如痴如醉

点赞
< 上一篇
下一篇 >

文章评论

取消回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据。

版权声明

为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

文章目录
  • SendSideBandwidthEstimation
  • LinkCapacityTracker
    • UpdateDelayBasedEstimate
    • OnRateUpdate
近期评论
  • Richard on WebRTC研究:Encoded Transform楼主你好,图片不见了,可以更新一下嘛?
  • flash91120 on Windows平台WebRTC编译-VS2017楼主,能不能出一期qt上使用webrtc…
  • damon on WebRTC音视频传输基础:NAT穿透太细了,看了眼我自己的笔记,果断直接删除…
  • k on Windows平台WebRTC编译(持续更新)麻烦问一下,我在src文件夹下,运行gn…
  • 小胖子 on WebRTC研究:Transport-cc之RTP及RTCP请教一个问题,在tcc的包里面的base…
相关文章
  • WebRTC研究:基于Transport Feedback的早期丢包检测
  • Continue,2022,加油
  • WebRTC研究:记一次音频带宽估计引入的异常分析
  • WebRTC研究:Encoded Transform
  • WebRTC研究:统计参数之往返时延

COPYRIGHT © 2022 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang