webrtc發(fā)送端-Rtcp數(shù)據(jù)流

github:https://github.com/bigonelby/webrtcUml/tree/master/latest

webrtc-發(fā)送端-Rtcp數(shù)據(jù)流.drawio.png
  1. 這個圖展示了webrtc中RTCP包的接收過程,整個過程涉及到的類很多

  2. 書接上文,這里的起點是WebrtcVideoChannel其OnPacketReceived方法,這個方法是rtp包流到媒體通道的入口

  3. WebrtcVideoChannel有個非常關(guān)鍵的成員,就是webrtc::Call,這個結(jié)構(gòu)體在PeerConnectionFactory創(chuàng)建PeerConnection的時候創(chuàng)建,因此是每個PC內(nèi)部只有一個Call,這個Call保存在PeerConnection中,在創(chuàng)建VideoChannel的時候,從PC中取出,并傳遞給MediaChannel,這就是WebrtcVideoChannel中Call的由來

  4. webrtc::Call的實現(xiàn)類是internal::Call,這個Call掌管底層的基本架構(gòu)。首先通過webrtc::Call的Receiver()接口,得到PacketReceiver,實際上實現(xiàn)這個接口的依然是internal::Call,因此WebrtcVideoChannel拿到packet后,會通過Call的Receiver的DeliverPacket方法,將收到的packet,送給internal::Call

  5. internal::Call在拿到Packet后,就要進行解析了,這里只是非常初步的解析,只要明白這個packet是rtp的還是rtcp的就可以了。我們以Rtcp的包為例,會進一步調(diào)用DeliverRtcp的方法。

  6. Call拿到數(shù)據(jù)為何很重要呢?實在是因為Call是一個大管家,他負責(zé)輔助WebrtcVideoChannel創(chuàng)建發(fā)送流和接收流,并且內(nèi)部維護了所有的發(fā)送,接收流。因此Call拿到Rtcp包后,就可以分發(fā)給其所有的發(fā)送接收流了

  7. 因此數(shù)據(jù)被送到了每個發(fā)送流里,即VideoSendStream。這個結(jié)構(gòu)是一個包裝類,其兩個重要的成員,VideoStreamEncoderInterface負責(zé)編碼,VideoSendStreamImpl負責(zé)數(shù)據(jù)包發(fā)送,層次分明。這里有個有意思的現(xiàn)象,VideoSendStreamImpl和VideoSendStream的關(guān)系并不是is-a的關(guān)系,而是has-a的關(guān)系。

  8. VideoSendStreamImpl繼續(xù)將數(shù)據(jù)向下游發(fā)送,由于是Rtp發(fā)送,因此數(shù)據(jù)送到了RtpVideoSender,這個RtpVideoSender是由RtpTransportControllerSendInterface創(chuàng)建的。RtpVideoSender維護了一個vector,不同的ssrc對應(yīng)不同的RtpStreamSender,這樣RTCP包進一步流到了RtpStreamSender中。

  9. RtpStreamSender將數(shù)據(jù)送給ModuleRtpRtcpImpl2,這樣數(shù)據(jù)到達了新的Module中,這個Module專門負責(zé)Rtp / Rtcp。這個Module有個關(guān)鍵的成員,是RTCPReceiver,這個類負責(zé)接收RTCP包,并進行解析。解析的步驟為:首先通過CommonHeader,解析出RTCP包的類型,再交由具體的類進行進一步解析,比如ReceiverReport,Remb。這些類都繼承自RtcpPacket,并提供Parse方法對Rtcp包進行解析。

  10. 各解析后的關(guān)鍵數(shù)據(jù)被保存在PacketInformation中,并通過回調(diào)將最終的結(jié)果返回給上層。

  11. 這里就是通過RtcpBandwidthObserver,將數(shù)據(jù)回調(diào),實現(xiàn)此接口的,又是RtpTransportControllerSend

  12. 最后一點需要說明的是,RtpTransportControllerSend是由Call創(chuàng)建出來的,也是每個PC只有一份,因此是所有的接收,發(fā)送碼流所共享。因此也是一個大管家的地位,可以宏觀調(diào)控各種資源。后面可以發(fā)現(xiàn),帶寬估算,碼率分配,這些關(guān)鍵的步驟,都和這個類有非常大的聯(lián)系

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容