webrtc自适应编码webrtc拥塞算法

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

2023-05-23  本文已影响0人  熊本熊之裸熊

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);
}

上一篇 下一篇

猜你喜欢

热点阅读