流媒体学习之路(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这个类干的最主要的工作。

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





