WebRTC原始碼分析四:視訊模組結構
本文在上篇的基礎上介紹WebRTC視訊部分的模組結構,以進一步瞭解其實現框架,只有瞭解了整體框架結構,對區域性演算法修改才能夠胸有成竹。
一、對外介面
對外介面有ViEBase,ViECapture,ViECodec,ViEEncryption,ViEFile,ViEImageProcess,ViENetwork,ViERender和ViERTP_RTCP。主要介面有:
1)ViEBase:負責建立和管理視訊會話鏈路;
2)ViECapture:設定採集裝置和引數;
3)ViEImageProcess:視訊畫面處理配置;
4)ViENetwork:通訊埠設定;
5)ViERender:渲染裝置選擇與設定。
與音訊類似,對外介面都是通過VideoEngine物件來獲取:
ViEInterfaceXX*pInterface = ViEInterfaceXX:GetInterface(pVideoEngine);
二、模組組成
模組之間的關係如圖1所示,紅色標明的模組與視訊產生相關,VideoCaptureModule負責產生視訊資料,通過VideoCaptureDataCallback和VideoCaptureFeedback回撥傳遞給採集模組。粉紅色標明的模組與視訊採集相關,ViECapturer負責採集視訊資料,封裝成視訊幀。通過ViEFrameProviderBase回撥註冊的ViEFrameCallback的介面。由於ViEEncoder實現了ViEFrameCallback介面,所以視訊幀傳遞給ViEEncoder進行編碼,VideoCodingModule一側模組完成是視訊幀的編碼工作。此外ViEEncoder實現了VCMPacketizationCallback介面,當編碼完視訊後,呼叫該介面通過RtpRtcp模組傳送視訊幀。綠色標明的模組與視訊的渲染相關。ViEChannel負責解碼接收的視訊幀,解碼後通過ViEFrameProviderBase介面將視訊幀傳遞給ViEFrameCallback,由於ViERenderer實現了該介面,所以最終傳遞到ViERenderer中,ViERenderer負責後續的渲染工作。
圖1 模組關係
三、設計模式
WebRTC原始碼中存在許多類似的場景:
Class CallbackA
{
Virtual void Completed()=0;
}
Class B
{
Public:
B(CallbackA*pCallbackA):Callback_(pCallbackA){}
Void Exec()
{
/**執行某些操作*/
Callback_->Completed();
}
}
Class A:public CallbackA
{
Public:
Void DoThing()
{
m_pB = new B(this);
m_pB->Exec();
delete m_pB;
}
Private:
B* m_pB;
}
之所以使用這種方式,有兩方面原因,一方面是層次劃分的原因,CallbackA屬於A類這一層的呼叫操作,但是它又必須在B類的某個方法後執行,所以使用回撥。另外一方面為了可擴充套件,允許在現有的結構上實現更多功能。
由於沒帶攝像頭,需要除錯一會,後續給出視訊通訊的程式碼示例。。。如果有不對的地方歡迎討論,多多學習!