【WebRTC】視訊採集

        視訊採集模組在WebRTC框架中負責從視訊源中採集視訊資料,傳送到本地顯示模組和編碼模組進行處理。視訊源除了常見的攝像頭,也可以是桌面抓屏或者視窗抓屏,或者一個視訊檔案。視訊採集模組是平臺相關的,MacOS和IOS平臺一般使用AVFoundation框架, Linux平臺一般使用V4L2庫,Windows平臺則使用MediaFoundation庫。

1. 視訊採集模組的實現

        WebRTC的視訊採集模組原始碼分佈在 \src\webrtc\modules\video_capture目錄下,分為平臺無關部分和平臺相關部分:平臺無關部分定義了視訊採集的通用介面,如StartCapture()  / StopCapture() / RegisterCaptureDataCallback() / DeRegisterCaptureDataCallback(),後者則在不同平臺上實現了這些介面。

       

       WebRTC的視訊採集模組UML類圖如下:

        視訊採集模組的虛基類為VideoCaptureModule, 它定義了一系列視訊採集的通用介面函式, StartCapture() 和StopCapture用來開始和結束視訊採集;RegisterCaptureDataCallback() 和DeRegisterCaptureDataCallback()用來註冊和登出資料回撥模組,資料回撥模組用來把視訊資料向上層模組推送。視訊採集模組採用WebRTC的通用模組機制,因此它繼承自Module類,用來完成通用的模組操作。

        VideoCaptureImpl類是VideoCaptureModule的實現,它實現父類定義的通用平臺無關的介面。對於平臺相關介面,則留在平臺相關的子類中實現。該類定義了一系列工廠方法來建立平臺相關的具體子類。在Linux平臺上實現的子類是VideoCaptureModuleV4L2。

        VideoCaptureModuleV4L2採用V4L2庫實現視訊採集功能,採集到的資料通過ioctl(_deviceFd, VIDIOC_DQBUF, &buf)介面匯出,由IncomingFrame()函式向上傳遞到VideoCaptureImpl::IncomingFrame()進行下一步處理。

       

        詳細的程式碼跳轉流程如下:

2.視訊資料的建立