WebRTC 媒体数据传输控制之平滑发送实现

的平滑发送 pacer 模块用于更有节奏地发送音视频媒体数据及音视频媒体传输控制数据 , 更具体地说 , 由于音频数据包大多比较小 , 一般不会超过 MTU , 因而 pacer 模块主要用于控制视频数据包的发送 。官方有一份文档对 pacer 的背景及主要设计思路做了简要介绍 , 其中文版翻译可以参考的平滑发送 。这里分析pacer 模块的实现 。
Pacer 在模块结构中的位置
在中 ,  是用于传输媒体流、数据流和控制数据包的连接的抽象 , ::Call 对象属于。::y 在创建对象时 , 会为其创建 ::Call 对象 。::Call 对象创建时 , 会创建 :: 对象 。:: 管理的 RTP 传输控制 , 包括管理 、 和 CC 等模块 。是 pacer 模块的入口 , 接收音视频 RTP 数据包和 pacer 发送控制参数; 则是 pacer 模块的出口 , 音视频 RTP 数据包从这里流出到后面的传输模块 。有两个实现 , 一个是 :: , 另一个是 :: , 具体采用的实现可以通过配置选项配置 ,  默认采用的实现为 :: 。
:: 对象的创建过程(//pacer/)如下:
#0webrtc::TaskQueuePacedSender::TaskQueuePacedSender (this=0x61a000017480, clock=0x602000003b90, packet_sender=0x61c000060108, event_log=0x613000011300, field_trials=0x602000002110, task_queue_factory=0x6020000020d0, max_hold_back_window=..., max_hold_back_window_in_packets=-1)at webrtc/modules/pacer/task_queue_paced_sender.cc:24#1webrtc::RtpTransportControllerSend::RtpTransportControllerSend (this=0x61c000060080, clock=0x602000003b90, event_log=0x613000011300, predictor_factory=0x0, controller_factory=0x0, bitrate_config=..., process_thread=..., task_queue_factory=0x6020000020d0, trials=0x602000002110)at webrtc/call/rtp_transport_controller_send.cc:111#3webrtc::RtpTransportControllerSendFactory::Create (this=0x602000002450, config=..., clock=0x602000003b90, process_thread=...)at webrtc/call/rtp_transport_controller_send_factory.h:28#4webrtc::CallFactory::CreateCall (this=0x60b000005840, config=...) at webrtc/call/call_factory.cc:110#5webrtc::PeerConnectionFactory::CreateCall_w (this=0x60b000005d10, event_log=0x613000011300)at webrtc/pc/peer_connection_factory.cc:351#6webrtc::PeerConnectionFactory::CreatePeerConnectionOrError(webrtc::PeerConnectionInterface::RTCConfiguration const&, webrtc::PeerConnectionDependencies)::$_3::operator()() const (this=0x7ffff3709430) at webrtc/pc/peer_connection_factory.cc:247
:: 和 :: 从 :: 获得  , 并分别通过 :: 和 ::/:: , 把和 pacer 逻辑接进整个音视频媒体数据发送处理流水线 。:: 和 :: 从 :: 获得 :: , 并把 RTP/RTCP 模块及 :: 接进 :: , 把传输逻辑接进 pacer 。Pacer 主要用于执行发送控制 , 它不直接执行网络数据传输操作 。
::/:: 通过从 :: 获得 :: , 把接收端各个媒体流的反馈消息发送通道 RTP/RTCP 模块及 :: 接进 pacer 。
::Call 对象属于  , 由其管理的 :: 和 pacer 也属于。特定的所有音频流和视频流共用相同的 pacer 对象 。
音频数据包发送过程如下:
#0webrtc::TaskQueuePacedSender::EnqueuePackets(std::vector >, std::allocator > > >) (this=0x61a000017480, packets=std::vector of length 1, capacity 1 = {...})at webrtc/modules/pacer/task_queue_paced_sender.cc:130#1webrtc::voe::(anonymous namespace)::RtpPacketSenderProxy::EnqueuePackets(std::vector >, std::allocator > > >)(this=0x60e000007d60, packets=std::vector of length 0, capacity 0) at webrtc/audio/channel_send.cc:267#2webrtc::RTPSender::SendToNetwork(std::unique_ptr >)(this=0x61b0000066c0, packet=std::unique_ptr = {...}) at webrtc/modules/rtp_rtcp/source/rtp_sender.cc:491#3webrtc::RTPSenderAudio::SendAudio(webrtc::AudioFrameType, signed char, unsigned int, unsigned char const*, unsigned long, long)(this=0x614000011a40, frame_type=webrtc::AudioFrameType::kAudioFrameSpeech, payload_type=111 'o', rtp_timestamp=3800543004, payload_data=http://www.kingceram.com/post/0x6110000aa040"x", payload_size=66, absolute_capture_timestamp_ms=-1) at webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc:316#4webrtc::voe::(anonymous namespace)::ChannelSend::SendRtpAudio(webrtc::AudioFrameType, unsigned char, unsigned int, rtc::ArrayView