一、核心功能
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_; // 安全处理未设置帧率的情况
六、典型工作流程
