• WebRTC清晰度和流畅度


    WebRTC清晰度和流畅度

    flyfish

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

    // 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,
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    接口是

      // See https://crbug.com/653531 and https://w3c.github.io/mst-content-hint.
      enum class ContentHint { kNone, kFluid, kDetailed, kText };
    
    • 1
    • 2

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

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    使用方法

    // 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;
    				}					
    			}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

    video_track->set_content_hint(webrtc::VideoTrackInterface::ContentHint::kDetailed);
    
    • 1

    参考
    https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference
    https://crbug.com/653531 and https://w3c.github.io/mst-content-hint

  • 相关阅读:
    如何统计数据库的QPS和TPS?
    MAUI Blazor (Windows) App 动态设置窗口标题
    如何在您的 Weblogic 应用程序上配置 HTTPS SSL?
    【JSON2WEB】11 基于 Amis 角色功能权限设置页面
    [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
    用《斗破苍穹》的视角打开C#多线程开发1(斗帝之路)
    MQTT 基础--Keep Alive和客户接管 - 第 10 部分
    网工内推 | IT高级运维工程师,周末双休,包吃包住,14-20k
    Android输入面板被键盘遮挡的解决办法
    Vue3-provide 和 inject 跨组件传递数据
  • 原文地址:https://blog.csdn.net/flyfish1986/article/details/132688261