1. 程式人生 > >WebRTC原始碼分析四:視訊模組結構

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類的某個方法後執行,所以使用回撥。另外一方面為了可擴充套件,允許在現有的結構上實現更多功能。

        由於沒帶攝像頭,需要除錯一會,後續給出視訊通訊的程式碼示例。。。如果有不對的地方歡迎討論,多多學習!