一、核心功能
EncodeUsageResource
是 WebRTC 视频自适应框架中的关键资源监控模块,主要功能:
CPU 编码负载检测:通过
OveruseFrameDetector
实时监控编码过程的 CPU 使用情况资源状态反馈:根据检测结果触发
kOveruse
(资源过载)或kUnderuse
(资源空闲)事件帧率自适应:结合目标帧率动态调整检测灵敏度
编码生命周期跟踪:通过帧编码开始/结束事件收集性能数据
二、核心算法原理
过载检测算法(在 OveruseFrameDetector
中实现):
基于编码时间的负载计算:
数学公式
load = (实际编码时间 / 理论可用时间) × 100%
其中理论可用时间 = 1 / 目标帧率
动态阈值机制:
当负载持续超过上限阈值 →
AdaptDown()
(触发降级)当负载持续低于下限阈值 →
AdaptUp()
(触发升级)
噪声抑制:采用时间窗口统计(如加权移动平均)避免瞬时波动误判
三、关键数据结构
// 核心成员变量 (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); }
五、设计亮点
分层解耦设计:
资源管理 (
VideoStreamEncoderResource
)检测算法 (
OveruseFrameDetector
)事件回调 (
OveruseFrameDetectorObserverInterface
)
线程安全模型:
RTC_DCHECK_RUN_ON(encoder_queue()); // 强制方法在编码队列执行
帧率敏感检测:
// 动态调整检测灵敏度 void OnTargetFramerateUpdated(int fps) { max_frame_interval_ = (fps > 0) ? 1000 / fps : 100; }
可选值安全处理:
absl::optional<double> target_frame_rate_; // 安全处理未设置帧率的情况