webrtc中视频分辨率自适应策略

webrtc中推流分辨率自适应是由 带宽评估、cpu使用率、qp值评估决定的。
其中带宽评估和qp评估是互斥的。以下使用的是cpu + qp值来控制分辨率自适应。

相关代码逻辑
一、开启

  1. 由 webrtc::VideoStreamEncoder::OnFrame 方法驱动 。
  VideoStreamEncoder   ReconfigureEncoder();

  stream_resource_manager_.ConfigureQualityScaler(info);
  stream_resource_manager_.ConfigureBandwidthQualityScaler(info);

 
  1. 添加相关评估策略
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);
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容