webrtc弱网-EncodeUsageResource类源码分析及算法原理

一、核心功能

EncodeUsageResource 是 WebRTC 视频自适应框架中的关键资源监控模块,主要功能:

  1. CPU 编码负载检测 :通过 OveruseFrameDetector 实时监控编码过程的 CPU 使用情况

  2. 资源状态反馈 :根据检测结果触发 kOveruse(资源过载)或 kUnderuse(资源空闲)事件

  3. 帧率自适应:结合目标帧率动态调整检测灵敏度

  4. 编码生命周期跟踪:通过帧编码开始/结束事件收集性能数据

二、核心算法原理

过载检测算法 (在 OveruseFrameDetector 中实现):

  1. 基于编码时间的负载计算

    数学公式

    复制代码
    load = (实际编码时间 / 理论可用时间) × 100%

    其中理论可用时间 = 1 / 目标帧率

  2. 动态阈值机制

    • 当负载持续超过上限阈值 → AdaptDown()(触发降级)

    • 当负载持续低于下限阈值 → AdaptUp()(触发升级)

  3. 噪声抑制:采用时间窗口统计(如加权移动平均)避免瞬时波动误判

三、关键数据结构

复制代码
// 核心成员变量 (encode_usage_resource.h)
std::unique_ptr<OveruseFrameDetector> overuse_detector_;  // 过载检测算法实现
bool is_started_;                                         // 检测状态标志
absl::optional<double> target_frame_rate_;                // 当前目标帧率

// 配置参数 (encode_usage_resource.cc)
CpuOveruseOptions options;  // 包含:
                            //   high_encode_usage_threshold_percent
                            //   low_encode_usage_threshold_percent
                            //   frame_timeout_interval_ms
                            //   min_frame_samples

四、核心方法详解

1. 初始化与启停控制
复制代码
// 创建资源实例 (工厂方法)
rtc::scoped_refptr<EncodeUsageResource> Create(...) {
  return new EncodeUsageResource(std::move(overuse_detector));
}

// 启动检测 (需在主线程执行)
void StartCheckForOveruse(CpuOveruseOptions options) {
  overuse_detector_->StartCheckForOveruse(...);  // 注入当前线程和配置
  overuse_detector_->OnTargetFramerateUpdated(...); // 初始化帧率参数
  is_started_ = true;
}

// 停止检测
void StopCheckForOveruse() {
  overuse_detector_->StopCheckForOveruse();
  is_started_ = false;
}
2. 帧率自适应控制
复制代码
void SetTargetFrameRate(absl::optional<double> target_frame_rate) {
  if (值变化) {
    target_frame_rate_ = target_frame_rate;  // 更新目标帧率
    overuse_detector_->OnTargetFramerateUpdated(...); // 重设检测参数
  }
}

// 目标帧率转换逻辑
int TargetFrameRateAsInt() {
  return target_frame_rate_.has_value() 
      ? static_cast<int>(*target_frame_rate_) 
      : std::numeric_limits<int>::max();  // 未设置时使用极大值
}
3. 编码事件处理
复制代码
// 编码开始时:捕获帧信息
void OnEncodeStarted(const VideoFrame& frame, int64_t time_us) {
  overuse_detector_->FrameCaptured(false, 0, frame, time_us);
}

// 编码完成时:记录关键时间点
void OnEncodeCompleted(uint32_t timestamp, int64_t sent_us, 
                       int64_t capture_us, absl::optional<int> encode_us) {
  overuse_detector_->FrameSent(false, timestamp, sent_us, capture_us, encode_us);
}
4. 过载回调处理
复制代码
// 检测到资源空闲 (触发升级)
void AdaptUp() {
  OnResourceUsageStateMeasured(ResourceUsageState::kUnderuse);
}

// 检测到资源过载 (触发降级)
void AdaptDown() {
  OnResourceUsageStateMeasured(ResourceUsageState::kOveruse);
}

五、设计亮点

  1. 分层解耦设计

    • 资源管理 (VideoStreamEncoderResource)

    • 检测算法 (OveruseFrameDetector)

    • 事件回调 (OveruseFrameDetectorObserverInterface)

  2. 线程安全模型

    复制代码
    RTC_DCHECK_RUN_ON(encoder_queue());  // 强制方法在编码队列执行
  3. 帧率敏感检测

    复制代码
    // 动态调整检测灵敏度
    void OnTargetFramerateUpdated(int fps) {
      max_frame_interval_ = (fps > 0) ? 1000 / fps : 100;
    }
  4. 可选值安全处理

    复制代码
    absl::optional<double> target_frame_rate_;  // 安全处理未设置帧率的情况

六、典型工作流程