WebRTC清晰度和流畅度

WebRTC清晰度和流畅度

flyfish

WebRTC提供了4种模式DISABLED,MAINTAIN_FRAMERATE,MAINTAIN_RESOLUTION,BALANCED

cpp 复制代码
// Based on the spec in
// https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference.
// These options are enforced on a best-effort basis. For instance, all of
// these options may suffer some frame drops in order to avoid queuing.
// TODO(sprang): Look into possibility of more strictly enforcing the
// maintain-framerate option.
// TODO(deadbeef): Default to "balanced", as the spec indicates?
enum class DegradationPreference {
  // Don't take any actions based on over-utilization signals. Not part of the
  // web API.
  DISABLED,
  // On over-use, request lower resolution, possibly causing down-scaling.
  MAINTAIN_FRAMERATE,
  // On over-use, request lower frame rate, possibly causing frame drops.
  MAINTAIN_RESOLUTION,
  // Try to strike a "pleasing" balance between frame rate or resolution.
  BALANCED,
};

接口是

cpp 复制代码
  // See https://crbug.com/653531 and https://w3c.github.io/mst-content-hint.
  enum class ContentHint { kNone, kFluid, kDetailed, kText };

根据源码 接口这里不是一一对应的kDetailed和kText是类似的

cpp 复制代码
webrtc::DegradationPreference
WebRtcVideoChannel::WebRtcVideoSendStream::GetDegradationPreference() const {
  // Do not adapt resolution for screen content as this will likely
  // result in blurry and unreadable text.
  // `this` acts like a VideoSource to make sure SinkWants are handled on the
  // correct thread.
  if (!enable_cpu_overuse_detection_) {
    return webrtc::DegradationPreference::DISABLED;
  }

  webrtc::DegradationPreference degradation_preference;
  if (rtp_parameters_.degradation_preference.has_value()) {
    degradation_preference = *rtp_parameters_.degradation_preference;
  } else {
    if (parameters_.options.content_hint ==
        webrtc::VideoTrackInterface::ContentHint::kFluid) {
      degradation_preference =
          webrtc::DegradationPreference::MAINTAIN_FRAMERATE;
    } else if (parameters_.options.is_screencast.value_or(false) ||
               parameters_.options.content_hint ==
                   webrtc::VideoTrackInterface::ContentHint::kDetailed ||
               parameters_.options.content_hint ==
                   webrtc::VideoTrackInterface::ContentHint::kText) {
      degradation_preference =
          webrtc::DegradationPreference::MAINTAIN_RESOLUTION;
    } else if (IsEnabled(call_->trials(), "WebRTC-Video-BalancedDegradation")) {
      // Standard wants balanced by default, but it needs to be tuned first.
      degradation_preference = webrtc::DegradationPreference::BALANCED;
    } else {
      // Keep MAINTAIN_FRAMERATE by default until BALANCED has been tuned for
      // all codecs and launched.
      degradation_preference =
          webrtc::DegradationPreference::MAINTAIN_FRAMERATE;
    }
  }

  return degradation_preference;
}

使用方法

cpp 复制代码
// create a new webrtc stream
{
	std::lock_guard<std::mutex> mlock(m_streamMapMutex);
	std::map<std::string, std::pair<rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>, rtc::scoped_refptr<webrtc::AudioSourceInterface>>>::iterator it = m_stream_map.find(streamLabel);
	if (it != m_stream_map.end())
	{
			std::pair<rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>, rtc::scoped_refptr<webrtc::AudioSourceInterface>> pair = it->second;
			rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> videoSource(pair.first);
			if (!videoSource)
			{
				RTC_LOG(LS_ERROR) << "Cannot create capturer video:" << videourl;
			}
			else
			{
				rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track = m_peer_connection_factory->CreateVideoTrack(streamLabel + "_video", videoSource.get());
									
				if ((video_track) && (!peer_connection->AddTrack(video_track, {streamLabel}).ok()))
				{
					RTC_LOG(LS_ERROR) << "Adding VideoTrack to MediaStream failed";
				}
				else
				{
	
					RTC_LOG(LS_INFO) << "VideoTrack added to PeerConnection";
					ret = true;
				}					
			}

上述代码video_track创建好之后,调用

cpp 复制代码
video_track->set_content_hint(webrtc::VideoTrackInterface::ContentHint::kDetailed);

参考

https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference

https://crbug.com/653531 and https://w3c.github.io/mst-content-hint

相关推荐
肖爱Kun1 天前
Webrtc本端发candidate给对端
webrtc
肖爱Kun1 天前
Webrtc本端和对端信令交互步骤
服务器·webrtc
肖爱Kun2 天前
Webrtc信令交互
服务器·webrtc
Fisher3Star4 天前
WebRTC Transport 两种创建方式的差异解析
webrtc
Fisher3Star4 天前
FFmpeg推流至Mediasoup全流程指南
webrtc
Fisher3Star4 天前
mediasoup 创建Router全流程详解
webrtc
声网4 天前
OpenAI 的 WebRTC 秘密架构:没有 SFU?没有问题!丨 Voice Agent 学习笔记
学习·架构·webrtc
HySpark8 天前
VAD 与流式 ASR 踩坑复盘及完整解决方案
webrtc·vad·离线语音转写·流式asr·qwen-asr·音频预处理
徐子元竟然被占了!!8 天前
WebRTC协议
webrtc
ZC跨境爬虫8 天前
跟着 MDN 学 HTML day_28:(使用选择器 API 在 DOM 树中进行选择与遍历)
前端·ui·html·音视频·webrtc