流媒体学习之路(mediasoup)——拥塞控制分析(6)

本文深入探讨了WebRTC中的拥塞控制机制,重点关注TransportCongestionControlClient和TransportCongestionControlServer两个类在发送端和接收端的角色。详细介绍了Transport-cc算法,包括基于丢包和延迟的带宽估算,以及GCC算法的过载检测器、速率控制器的工作原理。同时,展示了带宽估计和拥塞控制代码的关键部分。

流媒体学习之路(mediasoup)——拥塞控制分析(6)


  拥塞控制部分主要有两个类:TransportCongestionControlClient 和 TransportCongestionControlServer。这两个类的作用是分别作为发送端拥塞控制以及接收端拥塞控制。
  WebRTC作为P2P模式对两个点对点的网络传输做了很多抗弱网的工作,发送端和接收端都进行了密切的交互。为了适配这样的交互,在服务端进行两个拥塞控制设计就在所难免了。
  WebRTC的拥塞控制方式主要有以下几个:Transport-cc、BBR-congestion、remb(BBR已被google从webrtc移除了)。mediasoup支持Transport-cc和remb。

一、TransportCongestionControlClient

  在Transport类中继承了TransportCongestionControlClient类,这样每次产生传输事件的时候都会对该链路中的网络进行估算并反馈发送控制。

class TransportCongestionControlClient : public webrtc::PacketRouter,
	                                         public webrtc::TargetTransferRateObserver,
	                                         public Timer::Listener
	{
   
   
	public:
		struct Bitrates
		{
   
   
			uint32_t desiredBitrate{
   
    0u };
			uint32_t effectiveDesiredBitrate{
   
    0u };
			uint32_t minBitrate{
   
    0u };
			uint32_t maxBitrate{
   
    0u };
			uint32_t startBitrate{
   
    0u };
			uint32_t maxPaddingBitrate{
   
    0u };
			uint32_t availableBitrate{
   
    0u };
		};

	public:
		class Listener
		{
   
   
		public:
			virtual void OnTransportCongestionControlClientBitrates(
			  RTC::TransportCongestionControlClient* tccClient,
			  RTC::TransportCongestionControlClient::Bitrates& bitrates) = 0;
			virtual void OnTransportCongestionControlClientSendRtpPacket(
			  RTC::TransportCongestionControlClient* tccClient,
			  RTC::RtpPacket* packet,
			  const webrtc::PacedPacketInfo& pacingInfo) = 0;
		};

	public:
		TransportCongestionControlClient(
		  RTC::TransportCongestionControlClient::Listener* listener,
		  RTC::BweType bweType,
		  uint32_t initialAvailableBitrate);
		virtual ~TransportCongestionControlClient();

	public:
		RTC::BweType GetBweType() const
		{
   
   
			return this->bweType;
		}
		void TransportConnected();
		void TransportDisconnected();
		void InsertPacket(webrtc::RtpPacketSendInfo& packetInfo);
		webrtc::PacedPacketInfo GetPacingInfo();
		void PacketSent(webrtc::RtpPacketSendInfo& packetInfo, int64_t nowMs);
		void ReceiveEstimatedBitrate(uint32_t bitrate);
		void ReceiveRtcpReceiverReport(const webrtc::RTCPReportBlock& report, float rtt, int64_t nowMs);
		void ReceiveRtcpTransportFeedback(const RTC::RTCP::FeedbackRtpTransportPacket* feedback);
		void SetDesiredBitrate(uint32_t desiredBitrate, bool force);
		const Bitrates& GetBitrates() const
		{
   
   
			return this->bitrates;
		}
		uint32_t GetAvailableBitrate() const;
		void RescheduleNextAvailableBitrateEvent();

	private:
		void MayEmitAvailableBitrateEvent(uint32_t previousAvailableBitrate);

		// jmillan: missing.
		// void OnRemoteNetworkEstimate(NetworkStateEstimate estimate) override;

		/* Pure virtual methods inherited from webrtc::TargetTransferRateObserver. */
	public:
		void OnTargetTransferRate(webrtc::TargetTransferRate targetTransferRate) override;

		/* Pure virtual methods inherited from webrtc::PacketRouter. */
	public:
		void SendPacket(RTC::RtpPacket* packet, const webrtc::PacedPacketInfo& pacingInfo) override;
		RTC::RtpPacket* GeneratePadding(size_t size) override;

		/* Pure virtual methods inherited from RTC::Timer. */
	public:
		void OnTimer(Timer* timer) override;

	private:
		// Passed by argument.
		Listener* listener{
   
    nullptr };
		// Allocated by this.
		webrtc::NetworkControllerFactoryInterface* controllerFactory{
   
    nullptr };
		webrtc::RtpTransportControllerSend* rtpTransportControllerSend{
   
    nullptr };
		RTC::RtpProbationGenerator* probationGenerator{
   
    nullptr };
		Timer* processTimer{
   
    nullptr };
		// Others.
		RTC::BweType bweType;
		uint32_t initialAvailableBitrate{
   
    0u };
		Bitrates bitrates;
		bool availableBitrateEventCalled{
   
    false };
		uint64_t lastAvailableBitrateEventAtMs{
   
    0u };
		RTC::TrendCalculator desiredBitrateTrend;
	};

  上述展示了该类的头文件。可以看到,主要包含了:连接相关、发包控制、feedback处理等函数。

  连接相关(TransportConnected、TransportDisconnected):仅仅校验了该链路是否还在传输。

  发包控制
  GetPacingInfo:获取发送信息。
  成员——rtpTransportControllerSend:真正的发送控制者,通过对feedback信息估算出的带宽来调整发送(调用webrtc中的发送部分)。
  ReceiveEstimatedBitrate:处理接收方带宽估计后的码率。(与接收方带宽反馈相关 —— remb)

TransportControllerSend

  在TransportControllerSend的类中,继承了网络变化的观察者类:

class RtpTransportControllerSend final
    : public RtpTransportControllerSendInterface,
      public RtcpBandwidthObserver,
      public TransportFeedbackObserver,
      public NetworkStateEstimateObserver

  这些类通过拥塞控制算法以及网络参数来判断有多少数据可以发送到网络中。而传输使用的类就是PacketRouter。

// 接到feedback进行带宽估计
	OnTransportFeedback
// 接到remb的带宽反馈进行带宽控制
	OnReceivedEstimatedBitrate

  上面就是TransportControllerSend这个类干的最主要的工作。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值