• 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

  • 相关阅读:
    【我的前端】面向 JavaScript 开发:前端必学的4种函数式编程技术
    Spring(AOP)
    23种设计模式之备忘录模式(Memento Pattern)
    【LeetCode】63. 不同路径 II
    MediaRecorder实现录音
    webService
    线程(下):读写者模型\环形队列\线程池
    【LeetCode-278】第一个错误的版本
    mvc 异常处理源码解析(3)
    大数据课程L1——网站流量项目的概述&&整体架构
  • 原文地址:https://blog.csdn.net/flyfish1986/article/details/132688261