webrtc(7) 編碼數據發送模塊

編碼數據發送模塊

  • VideoSendStream把VideoStreamEncoder和VideoSendStreamImpl作爲子模塊,就可以很好的處理編碼和發送之間的關係了

  • 前面說到編碼之後的數據通過VideoSendStreamImpl::OnEncodedImage傳到了VideoSendStreamImpl模塊中

  • VideoSendStreamImpl包含的功能和模塊非常多:

    • 1、FEC控制模塊,FecController
    • 2、FEC發送模塊,FlexfecSender
    • 3、RTCP的feedback信息處理,EncoderRtcpFeedback
    • 4、帶寬監控,RtcpBandwidthObserver
    • 5、rtp、rtcp模塊,RtpRtcp
    • 6、數據輸出,PayloadRouter
  • VideoSendStreamImpl::OnEncodedImage收到編碼數據之後,開始調用:

    • 1、PayloadRouter::OnEncodedImage
    • 2、ModuleRtpRtcpImpl::SendOutgoingData,把數據傳到RtpRtcp模塊
    • 3、RTPSender::SendOutgoingData,RTP模塊發送數據
    • 4、RTPSenderAudio::SendAudio,音頻模塊發送數據
    • 5、RTPSenderVideo::SendVideo,視頻模塊發送數據
    • 6、FEC編碼:
      • 1、RTPSenderVideo::SendVideoPacketWithFlexfec
      • 1、RTPSenderVideo::SendVideoPacketAsRedMaybeWithUlpfec
    • 7、RTPSenderVideo::SendVideoPacket
    • 8、RTPSender::SendToNetwork
    • 9、RtpPacketHistory::PutRtpPacket,用於重傳
    • 10、PacedSender::InsertPacket,平滑發送
    • 11、RTPSender::SendPacketToNetwork
    • 12、Transport::SendRtp
  • 可以看到,調用流程非常複雜,但是可以簡化一下用語言描述:

    • 1、對編碼之後的幀數據進行分包,一個幀可以分成多個包
    • 2、對數據包打包,加上rtp頭部
    • 3、按照音視頻的不同,把媒體數據發送到不同的模塊
    • 4、如果有需要,那麼進行fec冗餘
    • 5、包數據包放進一個歷史隊列中,方便丟包的時候進行重傳
    • 6、爲了防止瞬時數據對網絡造成衝擊,需要把數據(實際上並不是媒體數據而是它們的信息)放進平滑發送模塊中
    • 7、平滑發送模塊把數據發送到網絡上
  • VideoSendStreamImpl並不執行具體的發送操作,而是把細節交給子模塊去完整

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