一、核心功能
VideoStreamEncoderResourceManager
是 WebRTC 视频编码资源管理的核心模块,主要职责包括:
资源管理:管理 CPU 使用率、QP 质量调节、像素限制等编码相关资源
自适应调节:根据网络/设备状态动态调整分辨率、帧率等编码参数
初始帧处理:在启动阶段智能丢弃帧以快速适应带宽
实验特性支持:质量斜坡实验、像素限制实验等
统计监控:通过回调接口上报自适应统计信息
二、核心算法原理
1. 资源过载检测算法
CPU 过载检测:通过
OveruseFrameDetector
分析编码耗时QP 质量检测:通过
QualityScalerResource
分析量化参数带宽质量检测:通过
BandwidthQualityScalerResource
分析码率限制
2. 自适应决策算法
三、关键数据结构
1. 资源映射表
std::map<rtc::scoped_refptr<Resource>, VideoAdaptationReason> resources_;
Key:资源对象指针
Value:资源类型(CPU 或 Quality)
2. 自适应计数器
VideoAdaptationCounters { int resolution_adaptations; // 分辨率调整次数 int fps_adaptations; // 帧率调整次数 }
3. 视频源限制
VideoSourceRestrictions { absl::optional<size_t> max_pixels_per_frame; // 最大像素 absl::optional<double> max_frame_rate; // 最大帧率 }
四、核心方法详解
1. 资源初始化方法
void ConfigureEncodeUsageResource() { if (encode_usage_resource_->is_started()) { encode_usage_resource_->StopCheckForOveruse(); } else { AddResource(encode_usage_resource_, VideoAdaptationReason::kCpu); } encode_usage_resource_->StartCheckForOveruse(GetCpuOveruseOptions()); }
2. 自适应决策回调
void OnResourceLimitationChanged( rtc::scoped_refptr<Resource> resource, const std::map<rtc::scoped_refptr<Resource>, VideoAdaptationCounters>& resource_limitations) { // 统计各资源类型的自适应次数 std::map<VideoAdaptationReason, VideoAdaptationCounters> limitations; for (auto& res_counter : resource_limitations) { limitations.emplace(GetReasonFromResource(res_counter.first), res_counter.second); } // 上报自适应统计 encoder_stats_observer_->OnAdaptationChanged( adaptation_reason, limitations[VideoAdaptationReason::kCpu], limitations[VideoAdaptationReason::kQuality]); }
3. 初始帧处理逻辑
class InitialFrameDropper { public: bool DropInitialFrames() const { return initial_framedrop_ < kMaxInitialFramedrop; // 最多丢弃4帧 } void OnFrameDroppedDueToSize() { ++initial_framedrop_; // 尝试降低分辨率 stream_adapter_->ApplyAdaptation(reduce_resolution); } };
五、设计亮点
资源/策略解耦:
资源检测独立于自适应策略
通过
ResourceAdaptationProcessor
接口实现松耦合
多维度自适应:
bool IsResolutionScalingEnabled() { return degradation_preference_ == MAINTAIN_FRAMERATE || degradation_preference_ == BALANCED; }
智能初始处理:
动态帧丢弃算法快速适应带宽
质量上升实验平滑提升画质
实验特性支持:
像素限制实验(WebRTC-PixelLimitResource)
质量上升实验(QualityRampUpExperiment)
六、典型工作流程
注释精要
// 视频源限制更新处理 void OnVideoSourceRestrictionsUpdated( VideoSourceRestrictions restrictions, const VideoAdaptationCounters& adaptation_counters, rtc::scoped_refptr<Resource> reason) { // 记录当前自适应状态 current_adaptation_counters_ = adaptation_counters; // 根据降级偏好过滤限制 video_source_restrictions_ = FilterRestrictionsByDegradationPreference( restrictions, degradation_preference_); // 更新目标帧率 MaybeUpdateTargetFrameRate(); } // 获取CPU过载检测配置 CpuOveruseOptions GetCpuOveruseOptions() const { CpuOveruseOptions options; // 硬件编码器使用更高阈值 if (encoder_settings_->encoder_info().is_hardware_accelerated) { options.low_encode_usage_threshold_percent = 150; options.high_encode_usage_threshold_percent = 200; } return options; } // 质量调节器配置 void ConfigureQualityScaler(const VideoEncoder::EncoderInfo& encoder_info) { // 检查是否允许质量调节 bool quality_scaling_allowed = IsResolutionScalingEnabled() && encoder_info.is_qp_trusted.value_or(true); if (quality_scaling_allowed) { // 获取实验性QP阈值 auto experimental_thresholds = QualityScalingExperiment::GetQpThresholds(); UpdateQualityScalerSettings(experimental_thresholds); } else { UpdateQualityScalerSettings(absl::nullopt); // 禁用质量调节 } }
该模块通过精细的资源管理和自适应策略,在复杂网络环境下实现视频质量、流畅度和资源消耗的最佳平衡,是 WebRTC 视频引擎的核心组件之一。