webrtc中视频分辨率自适应策略
2023-05-23 本文已影响0人
熊本熊之裸熊
webrtc中推流分辨率自适应是由 带宽评估、cpu使用率、qp值评估决定的。
其中带宽评估和qp评估是互斥的。以下使用的是cpu + qp值来控制分辨率自适应。
相关代码逻辑
一、开启
- 由 webrtc::VideoStreamEncoder::OnFrame 方法驱动 。
VideoStreamEncoder ReconfigureEncoder();
stream_resource_manager_.ConfigureQualityScaler(info);
stream_resource_manager_.ConfigureBandwidthQualityScaler(info);
- 添加相关评估策略
void ResourceAdaptationProcessor::AddResource(
rtc::scoped_refptr<Resource> resource) {
RTC_DCHECK(resource);
{
MutexLock crit(&resources_lock_);
RTC_DCHECK(absl::c_find(resources_, resource) == resources_.end())
<< "Resource \"" << resource->Name() << "\" was already registered.";
resources_.push_back(resource);
}
resource->SetResourceListener(resource_listener_delegate_.get());
RTC_LOG(LS_INFO) << "Registered resource \"" << resource->Name() << "\".";
}
二、工作
1、
ResourceAdaptationProcessor::OnResourceUsageStateMeasured 方法中收到回调,判断是升或者降
switch (usage_state) {
case ResourceUsageState::kOveruse:
result_and_message = OnResourceOveruse(resource);
break;
case ResourceUsageState::kUnderuse:
result_and_message = OnResourceUnderuse(resource);
break;
}
由stream_adapter_ 往上回调
stream_adapter_->ApplyAdaptation(adaptation, reason_resource);
void VideoStreamAdapter::ApplyAdaptation
方法中继续往上通知
BroadcastVideoRestrictionsUpdate
3、
void VideoStreamAdapter::BroadcastVideoRestrictionsUpdate
方法中继续往上通知
restrictions_listener->OnVideoSourceRestrictionsUpdated(
filtered, current_restrictions_.counters, resource,
source_restrictions());
4、
void VideoStreamEncoder::OnVideoSourceRestrictionsUpdated
方法中往上回调到video_source_sink_controller_
void VideoSourceSinkController::PushSourceSinkSettings() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
if (!source_)
return;
rtc::VideoSinkWants wants = CurrentSettingsToSinkWants();
source_->AddOrUpdateSink(sink_, wants);
}
5、
void AdaptedVideoTrackSource::AddOrUpdateSink(
rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
const rtc::VideoSinkWants& wants) {
broadcaster_.AddOrUpdateSink(sink, wants);
OnSinkWantsChanged(broadcaster_.wants());
}
void AdaptedVideoTrackSource::OnSinkWantsChanged(
const rtc::VideoSinkWants& wants) {
video_adapter_.OnSinkWants(wants);
}