webrtc(4) 模塊之間的關係

模塊之間的關係

發送端

  • 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的上層

  • 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的上層

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章