模塊之間的關係
發送端
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的上層