Webrtc中的各種Channel

原文鏈接:https://www.jianshu.com/p/d6030e7aa282

背景

自己決定整理整理之前的筆記,今天整理的這一篇是webrtc相關的,自己在這方面已經工作了幾年了,之前也總結了一些文檔,正好藉助網絡的平臺整理整理

對象圖

channelmanager_class.png

對象圖分析

這張圖我覺得是一個非常宏觀的圖了,我們研究的最多的音視頻模塊,居然在這張圖裏,也只是一小部分而已。現在重新來看這張圖,回憶當時繪圖的思路,總結總結。

WebRtcSession

這個Session,可以說是webrtc對通話模型的一個抽象,那麼在進行webrtc通話的時候,可以有音頻,也可以有視頻,還可以有一些數據(信息,文件等)。因此可以理解爲WebRtcSession是一個最宏觀的抽象了

BaseChannel

在webrtc通話的過程中,顯然形式是豐富多彩的,如上面介紹的,可以有視頻,音頻,以及數據。因此webrtc對這些元數據也進行了抽象封裝,這就是BaseChannel,即基本通道。這是一個基類,繼承這個基類的,有VideoChannel,VoiceChannel以及DataChannel,分別負責傳輸視頻數據,音頻數據以及其他數據。

ChannelManager

介紹完了BaseChannel,以及其三種多態形式,下面介紹ChannelManager,這其實也是常見的思路,在Android中會經常有類似的命名方式,xxxMaster,xxxManager,xxxHolder等等,其實都是一個控制類。控制什麼呢?從名字就可以看出來,就是控制Channel的,究竟是哪個channel呢?就是上面介紹的BaseChannel。再具體一點,實際上上述的三個channel,都是由channelmanager創建出來的。從對象圖中我們可以看到這種關係,WebRtcSession有一個成員變量(has-a)ChannelManager,而ChannelManager創建了(create)三種Channel(VoiceChannel,VIdeoChannel以及DataChannel)

MediaChannel

下面看看MediaChannel,前面介紹了BaseChannel,以及其三個衍生品,但BaseChannel的主要職責是發送數據,那麼數據究竟是怎麼產生的呢?我們知道,無論是音頻數據,還是視頻數據,都要經過一系列的流程纔可以產生,比如採集,編碼,分包。這個過程顯然並不是BaseChannel的職責,專門有對象負責這些事情,就是MediaChannel,也就是媒體通道。由此可見,Webrtc中的通道很多,但是實際上是各司其職,每個通道都由各自的用途。那麼MediaChannel和BaseChannel之間的關係是什麼樣呢?實際上也是has-a的關係,即每個BaseChannel中都有一個MediaChannel。

WebRtcVideoChannel2

提起WebRtcVideoChannel2我們應該再熟悉不過了,相信對於開發webrtc視頻底層相關同學,都很熟悉這個對象了,正是這個對象,封裝了視頻的採集,編解碼,以及分包,解包。實際上這個結構體的本質,就是一個MediaChannel,從對象圖中我們可以看見這個繼承關係。如果要是個性化開發的話,實際上也就是從WebRtcVideoChannel2入手就可以了,在52版本上,拿到camera的數據,並和WebRtcVideoChannel2掛鉤,並且配置WebRtcVideoChannel2的發送/接受碼流,以及其參數,視頻就可以打通了。

MediaEngineInterface

既然介紹了MediaChannel,自然就要想到,究竟是誰創建了MediaChannel呢?就如同上面介紹的,ChannelManager創建了BaseChannel,這裏MediaEngineInterface創建了MediaChannel。即媒體引擎創建了媒體通道。這裏的媒體引擎,是一個Interface,顯然,webrtc的思想是基於抽象進行編程,因此這裏提取了Interface層。這種解耦的設計方式也值得我們學習。

CompositeMediaEngine

這個對象是MediaEngineInterface的實現類,從命名上來看,實際上是一個組合的媒體引擎,何謂組合呢?就是其有兩個成員,其一爲WebRtcVoiceEngine,專門負責創建音頻的MediaChannel;其二爲WebRtcVideoEngine2,專門負責創建視頻的MediaChannel,也就是WebRtcVideoChannel2。這種組合的方式的設計,讓整個框架更有彈性,比如其中的一個好處,就是音頻,視頻引擎可以獨立的升級。我們注意到WebRtcVideoEngine2和WebRtcVideoChannel2都有一個2,表明是一個升級版本。由於採用了組合模式,音頻和視頻的升級相對獨立。

WebRtcMediaEngine2

最後要說說WebRtcMediaEngine2了,這個對象我們也應該非常熟悉。實際上初次瞭解Webrtc媒體相關的同學,可能就是從WebRtcVideoEngine2以及WebRtcVideoChannel2看起的。但是可能這兩個結構體在整個webrtc中的位置就不是很清晰了。從對象圖上可以很容易的看出兩者的關係,WebRtcMediaEngine2本質上是一個MediaEngineInterface,其作用就是爲BaseChannel創建MediaChannel。

小結

  1. WebRtcSession是一個最宏觀的抽象
  2. WebRtcSession中有一個成員是ChannelManager
  3. ChannelManager的作用是創建BaseChannel
  4. BaseChannel分爲VoiceChannel,VideoChannel以及DataChannel
  5. BaseChannel有一個MediaChannel
  6. ChannelManager的成員MediaEngineInterface負責創建MediaChannel
  7. 具體到視頻,WebRtcVideoEngine2創建了WebRtcVideoChannel2
  8. MediaChannel負責媒體數據的採集,編解碼,以及分包解包數據



作者:bigonelby
鏈接:https://www.jianshu.com/p/d6030e7aa282
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

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