編碼數據發送模塊
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並不執行具體的發送操作,而是把細節交給子模塊去完整