Chromium WebRTC 如何确定质量限制原因?

Its*_*lon 1 webrtc

在 RTCOutboundRtpStreamStats 的 WebRTC 统计数据中,我们有指标qualityLimitationReason

该指标指示流质量下降的原因,可以是以下之一:“none”、“bandwidth”、“cpu”、“other”。

如果我们想了解我们的应用程序过度使用了哪些资源,这非常有用。

Chromium WebRTC 计算原因的逻辑是什么?

Ari*_*ite 7

如规范中所述,qualityLimitationReason报告“最限制因素”(如果存在多个因素,则定义优先级顺序):

实施报告了最大的限制因素。如果由于可能存在多个因素而导致实现无法确定最大限制因素,则必须按以下优先级顺序报告原因:“带宽”、“cpu”、“其他”。

此外,该规范还包括注释:

CPU和带宽资源的消耗是相互依赖且难以估计的,因此很难确定“最限制因素”是什么。这里提出的优先级顺序是基于这样的启发:“带宽”通常变化更大,因此是比“cpu”更可能和更有用的信号。


该值在WebRTC Native CodequalityLimitationReason设置:

  bool is_cpu_limited = cpu_counts.resolution_adaptations > 0 ||
                        cpu_counts.num_framerate_reductions > 0;
  bool is_bandwidth_limited = quality_counts.resolution_adaptations > 0 ||
                              quality_counts.num_framerate_reductions > 0 ||
                              bw_limited_layers_ || internal_encoder_scaler_;
  if (is_bandwidth_limited) {
    // We may be both CPU limited and bandwidth limited at the same time but
    // there is no way to express this in standardized stats. Heuristically,
    // bandwidth is more likely to be a limiting factor than CPU, and more
    // likely to vary over time, so only when we aren't bandwidth limited do we
    // want to know about our CPU being the bottleneck.
    quality_limitation_reason_tracker_.SetReason(
        QualityLimitationReason::kBandwidth);
  } else if (is_cpu_limited) {
    quality_limitation_reason_tracker_.SetReason(QualityLimitationReason::kCpu);
  } else {
    quality_limitation_reason_tracker_.SetReason(
        QualityLimitationReason::kNone);
  }
Run Code Online (Sandbox Code Playgroud)

从上面可以看出,如果计数器 resolution_adaptations大于num_framerate_reductions零,则认为流受到 CPU ( cpu) 或带宽 ( bandwidth) 的限制。

每当分辨率降低帧速率降低时,相应的计数器就会递增,如果分辨率/帧速率增加,则反之亦然(递减)。

这些适应被触发OnResourceUsageStateMeasured()。说明ResourceUsageState是否观察到资源过度使用或未充分使用。

此事件可能因多种不同原因而触发,例如热限制(请参阅此处)或框架使用不足/过度使用(请参阅此处)。

上述适应计数器(分辨率帧率)被认为是 CPU 适应,但是如果质量缩放器资源带宽缩放器资源启动,那么它们也被认为是与带宽相关的(请参阅此处)。由于“带宽”的优先级较高,这意味着在本例中原因将被列为“带宽”。

有关这些定标器功能的更多信息,请参阅QualityScalerBandwidthQualityScaler类描述。

此外,如果设置了bw_limited_layers_或 ,internal_encoder_scaler_那么原因也被认为是“带宽”。

否则,原因设置为“无”。


总结一下,在WebRTC Native Code包中,qualityLimitationReason可以设置为以下值之一:

  • 带宽
    • 如果以下任一条件为真,则设置此值:
      • 质量缩放器或带宽缩放器已启动,并且分辨率或帧速率由于资源过度使用而降低
      • 由于可用带宽低,层被禁用
      • 内部编码器已对结果进行缩放
  • 中央处理器
    • 如果以下两个条件都为真,则设置此值:
      • 不考虑“带宽”的原因
      • 由于资源过度使用,分辨率或帧率降低
  • 没有任何
    • 如果没有观察到上述任何原因,则设置此值

造成限制的根本原因可能是多种因素,例如热限制、带宽限制、CPU 使用率或内部编码器缩放。