剑痴乎

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

WebRTC研究:应用受限区域探测器-AlrDetector

2019年11月4日 4873点热度 4人点赞 8条评论

在WebRTC GCC(Google Congestion Control)中,有一个叫做AlrDetector(应用受限区域探测器,Application limited region detector)的模块。该模块利用某段时间值,以及这段时间发送的字节数判断当前输出网络流量是否受限。这些限制主要跟应用程序本身输出网络流量的能力有关,例如编码器性能,不能编码出设置的目标码率。下面举个简单例子说明下。

假设我们经过带宽预测后,获取到一个目标码流target_bitrate_bps,此时我们程序需要按照该码率大小进行数据发送,但是一切都不是那么完美,例如编码器。编码器由于各种问题,编码出的数据码率低于target_bitrate_bps,使得数据发送码率低于要求,带宽利用率不足,发送码率占最大预算码率值比例低于某个值的话Alr(Application limited region)就会被触发了,恢复到某个值以上,Alr会停止。

下面说下AlrDetector的工作流程。
1)首先是在构造函数初始化相关参数配置,相关参数如下:

C++
1
2
3
4
5
6
7
struct AlrDetectorConfig {
  // until BW adjustments of application limited region is fine tuned.
  double bandwidth_usage_ratio = 0.65;
  double start_budget_level_ratio = 0.80;
  double stop_budget_level_ratio = 0.50;
  std::unique_ptr<StructParametersParser> Parser();
};

IntervalBudget::can_build_up_underuse_初始化为true。IntervalBudget根据输入的评估码率,计算当前还能发送多少数据。

2)设置带宽预测得到的码率:

C++
1
2
3
void AlrDetector::SetEstimatedBitrate()
                   ↓
void IntervalBudget::set_target_rate_kbps()

3)发送数据时调用:

C++
1
2
3
4
5
void AlrDetector::OnBytesSent()
               ↓
void IntervalBudget::UseBudget()
               ↓
void IntervalBudget::IncreaseBudget()

通过IntervalBudget::budget_ratio与start_budget_level_ratio以及stop_budget_level_ratio对比,设置AlrDetector的状态。

C++
1
2
3
4
5
6
7
8
9
10
bool state_changed = false;
  if (alr_budget_.budget_ratio() > conf_.start_budget_level_ratio &&
      !alr_started_time_ms_) {
    alr_started_time_ms_.emplace(rtc::TimeMillis());
    state_changed = true;
  } else if (alr_budget_.budget_ratio() < conf_.stop_budget_level_ratio &&
             alr_started_time_ms_) {
    state_changed = true;
    alr_started_time_ms_.reset();
  }

IntervalBudget::budget_ratio表示剩余要发送的数据占最大预算发送数据max_bytes_in_budget_的比例,定义如下:

C++
1
2
3
4
5
double IntervalBudget::budget_ratio() const {
  if (max_bytes_in_budget_ == 0)
    return 0.0;
  return static_cast<double>(bytes_remaining_) / max_bytes_in_budget_;
}

max_bytes_in_budget_按500ms时间窗口计算得到:

C++
1
2
constexpr int64_t kWindowMs = 500;
max_bytes_in_budget_ = (kWindowMs * target_rate_kbps_) / 8;

可知如果IntervalBudget::budget_ratio大于start_budget_level_ratio,即剩余数据还有很多,发送码率低了,带宽没充分利用,Alr触发了,小于stop_budget_level_ratio时,alr_started_time_ms_重置,Alr停止。

4)通过获取AlrDetector::alr_started_time_ms_判断当前Alr是否触发,调用函数如下:

C++
1
absl::optional<int64_t> AlrDetector::GetApplicationLimitedRegionStartTime()

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

Jeff

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

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • whale

    楼主,请问这个AlrDetector触发了有什么行为呢?

    2021年1月5日
    回复
    • Jeff

      @whale 作为一种信号,调整码率时用到。带宽估计调整码率时,如果得到Increase的码率状态,此时本来需要向上调整码率的,但是此时处于alr状态,就跳过此次调整了。

      2021年1月6日
      回复
  • whale

    应用层编码器数据码率 ---> gcc传输层速率 --->按组发包 。如果没有这个AlrDetector,其实也只是让gcc发送更频繁,每组包更多,发送不平滑、更具“突发性”,由于此时gcc测得的物理带宽可以满足这种“突发”速率,因此,不会造成网络拥塞。
    所以,楼主,这个AlrDector似乎存在意义不大?

    2021年1月7日
    回复
    • Jeff

      @whale 不知道你怎么得出让gcc发送更频繁这个结论

      2021年1月8日
      回复
      • LJun

        @Jeff @whale 你应该是觉得alr不启用的话,gcc就可以肆意妄为?我读下来觉得alr的存在作用只是在发送码率(应用性能不足)远低于目标码率,没充分利用实际带宽时,起到减少网络调整运算。不知理解是否有出入

        2021年8月1日
        回复
  • 5555

    有个疑问alr触发时,那本次调整码率无效,还是按之前的值进行发送,如果下一次带宽反馈没来的话,等alr恢复时,这个调整码率是之前还是上次反馈的?

    2021年6月6日
    回复
    • Jeff

      @5555 之前值

      2021年6月7日
      回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

    版权声明

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

    最近评论
    ztt 发布于 3 周前(04月05日) 你好,想看里面的视频和图片为什么没有显示呢?需要下flash吗还是什么。
    huowa222 发布于 1 个月前(03月26日) 同问
    邱国禄 发布于 2 个月前(02月17日) Receive Delta以0.25ms为单位,reference time以64ms为单位,kDe...
    啊非 发布于 4 个月前(12月30日) 大神,请教一个问题: constexpr int kBaseScaleFactor = Tran...
    啊非 发布于 4 个月前(12月30日) reference time:3字节,表示参考时间,以64ms为单位,但是 代码里面是 Trans...
    相关文章
    • WebRTC资讯:H265支持进展
    • WebRTC研究:Audio level
    • Mac平台WebRTC编译
    • WebRTC研究:RTP时间戳的产生
    • WebRTC研究:统计参数之丢包率

    COPYRIGHT © 2024 jianchihu.net. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang