webrtc(4) 模块之间的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NB_vol_1/article/details/82118830

模块之间的关系

发送端

  • 1、Transport,是最底层的发送操作,位于所有模块的底部,用于把数据(rtp、rtcp)发送到网络中

  • 2、RTPSenderVideo、RTPSenderAudio,属于RTPSender的子模块,处理具体媒体数据的发送前处理(如fec等),最终他们还是透过RTPSender进行数据发送

  • 3、RTPSender,位于Transport的上面,通过调用Transport来实现数据发送的操作,RTPSender主要提供下面的功能:

    • 3.1、对媒体数据(音视频数据或者fec的冗余数据)进行封装
    • 3.2、处理重传操作(nack、ARQ)
    • 3.3、利用PacerSender实现平滑发送的功能
    • 3.4、进行FEC冗余操作
    • 3.5、调用Transport发送数据
  • 4、ModuleRtpRtcpImpl,位于RTPSender的上层,RTPSender是它的子模块,它主要提供下面的功能

    • 4.1、RTP数据的发送,RTPSender
    • 4.2、RTCP数据的发送,RTCPSender
    • 4.3、RTCP数据的接收,RTCPReceiver
    • 4.4、关键帧请求,KeyFrameRequestMethod
    • 4.5、远端带宽估计,RemoteBitrateEstimator
  • 5、RtpRtcp,提供RTP、RTCP的抽象接口,可以这样说:RtpRtcp是抽象,ModuleRtpRtcpImpl是具体

  • 6、VideoSendStreamImpl、AudioSendStream,位于RtpRtcp的上层,RtpRtcp是他们的子模块

  • 7、VideoSendStream,位于VideoSendStreamImpl的上层,VideoSendStreamImpl是他的子模块

    • 7.1、包含了编码模块:VideoStreamEncoder
    • 7.2、包含了发送实现模块:VideoSendStreamImpl
    • 7.3、提供发送RTCP的接口:DeliverRtcp
    • 7.4、注意没有提供RTP发送的接口,因为的RTP发送是内部隐含实现的,Capture采集到图像数据之后,送到编码器,编码输出交给RtpRtcp模块进行fec冗余、打包等操作,然后发送
    • 7.5、设置数据源的接口:SetSource,它设置图像数据的来源,一般来说是Capture
    • 7.6、如果你对默认的编码器、fec、ARQ等模块不满意,那么可以通过VideoSendStream::Config啦定制你需要的东西,VideoSendStream::Config包含了很多模块以及相应的配置信息:
      • 7.5.1、编码器的设置:EncoderSettings
      • 7.5.2、Rtp的设置:Rtp,其中Rtp又包括下面的一些设置:
        • ARQ模块的设置:NackConfig
        • FEC模块的设置:UlpfecConfig、Flexfec
        • 重传包的设置:Rtx
      • 7.5.3、Rtcp的设置:Rtcp
      • 7.5.4、数据传输模块:Transport
      • 7.5.5、编码前处理:rtc::VideoSinkInterface
      • 7.5.6、编码后处理:EncodedFrameObserver
  • 8、Call,位于VideoSendStream的上层,VideoSendStream是他的子模块,它主要提供下面的模块和功能

    • 8.1、假设A和B要通话,那么A和B都需要两个Call,一个Call用于发送数据,另一个Call用于接收数据
    • 8.2、创建Call需要一个配置信息Call::Config,Call::Config包含下面的一些模块,如果有需要你可以仔细配置Call::Config的内容,下面说说它包含的模块:
      • 8.1.1、码控设置:BitrateConstraints
      • 8.1.2、音频状态(设备、混音等):AudioState
      • 8.1.3、音频处理:AudioProcessing
      • 8.1.4、fec冗余模块:FecControllerFactoryInterface
    • 8.3、从功能上来看,Call就像一个容器,装了很多个模块。下面从其中的一个模块VideoSendStream分析;VideoSendStream是视频数据发送流,它对外表现为一个数据流:
      • 8.3.1、需要提供一个数据源,这个数据数据源用于提供数据(未编码的图像数据)输入,一般来说是一个Capture
      • 8.3.2、需要提供一个数据输出点,因为图像数据处理之后你需要发送给对方,这个数据输出点就是Transport,Transport直接调用socket发送数据到网上
      • 8.3.3、未编码的数据不能直接发送到网上,因此VideoSendStream还需要提供一个视频编码器
      • 8.3.4、编码之后的数据需要打包成一个个的数据包才能发送,因此它还包括一个RTP模块用于数据打包
      • 8.3.5、由于音视频数据使用udp进行传输,因此可能会丢包,为了抗丢包,它还提供了fec、nack等模块
      • 8.3.6、由于udp没有拥塞控制,需要实现应用层的拥塞控制算法,因此它还包括了拥塞控制、带宽估计、feedback、PacerSender等模块

接收端

接收端处理数据分为两个部分:
- 解析RTP数据
- 解码

解析RTP数据

  • 1、从网络收到数据
  • 2、Call::DeliverPacket
  • 3、Call::DeliverRtp
  • 4、RtpStreamReceiverController::OnRtpPacket
  • 5、RtpDemuxer::OnRtpPacket
  • 6、RtpVideoStreamReceiver::OnRtpPacket,和上面能连接起来的关键是RtpStreamReceiverController::CreateReceiver,RtpVideoStreamReceiver继承自RtpPacketSinkInterface
  • 7、RtpVideoStreamReceiver::OnRtpPacket、RtpVideoStreamReceiver::OnRecoveredPacket
  • 8、RtpVideoStreamReceiver::ReceivePacket
  • 9、RtpReceiverImpl::IncomingRtpPacket
  • 10、RTPReceiverVideo::ParseRtpPacket
  • 11、RtpVideoStreamReceiver::OnReceivedPayloadData,通过RtpReceiver::CreateVideoReceiver和上面结合起来
  • 12、PacketBuffer::InsertPacket、NackModule::OnReceivedPacket
  • 13、RtpVideoStreamReceiver::OnReceivedFrame,通过video_coding::PacketBuffer::Create和上面结合起来
  • 14、RtpFrameReferenceFinder::ManageFrame
  • 15、RtpVideoStreamReceiver::OnCompleteFrame
  • 16、VideoReceiveStream::OnCompleteFrame
  • 17、FrameBuffer::InsertFrame、RtpVideoStreamReceiver::FrameContinuous,至此,帧已经插入JitterBuffer中

解码

  • 1、VideoReceiveStream::VideoReceiveStream、VideoReceiveStream::Start
  • 2、VideoReceiveStream::DecodeThreadFunction
  • 3、VideoReceiveStream::Decode
  • 4、FrameBuffer::NextFrame(还调用了另一个FrameBuffer::NextFrame)
  • 5、VideoReceiver::Decode
  • 6、VCMGenericDecoder::Decode
  • 7、H264DecoderImpl::Decode
  • 8、VCMDecodedFrameCallback::Decoded
  • 9、VideoStreamDecoder::FrameToRender
  • 10、VideoReceiveStream::OnFrame
  • 11、render,渲染播放

解码侧模块之间的关系

  • RTPReceiverVideo、RTPReceiverAudio,解析RTP数据的最底层

  • RtpReceiver,即RtpReceiverImpl,位于RTPReceiverVideo、RTPReceiverAudio的上层

    扫描二维码关注公众号,回复: 2944752 查看本文章
  • RtpVideoStreamReceiver,位于RtpReceiver的上层,它包含了下面的子模块:

    • 1、RtpReceiver
    • 2、UlpfecReceiver
    • 3、RtpRtcp
    • 4、KeyFrameRequestSender
    • 5、NackModule
    • 6、video_coding::PacketBuffer
    • 7、video_coding::RtpFrameReferenceFinder
    • 8、video_coding::H264SpsPpsTracker
    • 9、RtpPacketSinkInterface
    • 10、video_coding::OnCompleteFrameCallback
    • 11、PacketRouter
    • 12、RemoteNtpTimeEstimator
    • 13、RTPPayloadRegistry
  • VideoReceiveStream,位于RtpVideoStreamReceiver的上层,它还包含下面的模块:

    • 1、TransportAdapter
    • 2、ReceiveStatistics
    • 3、VCMTiming
    • 4、vcm::VideoReceiver
    • 5、rtc::VideoSinkInterface
    • 6、ReceiveStatisticsProxy
    • 7、RtpVideoStreamReceiver
    • 8、VideoStreamDecoder
    • 9、VCMJitterEstimator
    • 10、video_coding::FrameBuffer
    • 11、RtpStreamReceiverInterface
    • 12、RtxReceiveStream
    • 13、RtpStreamReceiverInterface
  • Call,位于VideoReceiveStream的上层

猜你喜欢

转载自blog.csdn.net/NB_vol_1/article/details/82118830