WebRTC手記之本地視頻採集

轉載請註明出處:http://www.cnblogs.com/fangkm/p/4374610.html html

前面兩篇文章介紹WebRTC的運行流程和使用框架接口,接下來就開始分析本地音視頻的採集流程。因爲篇幅較大,視頻採集和音頻採集分紅兩篇博文,這裏先分析視頻採集流程。分析的時候先分析WebRTC原生的視頻採集流程,再捎帶提一下Chromium對WebRTC視頻採集的適配,這樣能更好地理解WebRTC的接口設計。架構

1. WebRTC原生視頻採集

在介紹視頻設備的採集以前,首先要分析一下WebRTC的DeviceManager結構,由於視頻採集的抽象接口VideoCapturer的WebRTC原生實現就是經過它來建立的。這個類的功能還包括枚舉音視頻設備的相關信息等。結構以下:框架

限於篇幅,該UML中沒有標出DeviceManagerInterface接口的全部功能接口,具體包括:獲取音頻輸入/輸出設備列表、獲取視頻輸入設備列表、根據設備信息建立VideoCapturer視頻採集對象等。因爲獲取硬件設備列表,涉及到平臺相關的調用,在Windows平臺下的實現是Win32DeviceManager類(能夠調用DeviceManagerFactory的靜態方法Create()返回當前平臺相應的DeviceManager對象)。關注一下DeviceWatcher,顧名思義,它的功能在於監控設備的變化。在Windows平臺下的實現Win32DeviceWatcher經過API函數RegisterDeviceNotification監控視頻類設備和音頻類設備的變化。當有監視的類型設備發送變化時,會經過DeviceManagerInterface接口的SignalDevicesChange信號向外投遞通知。最後分析一下建立VideoCapturer的流程。DeviceManager建立VideoCapturer對象時經過VideoDeviceCapturerFactory接口來完成的。VideoDeviceCapturerFactory接口的默認實現是WebRtcVideoDeviceCapturerFactory類,該類建立WebRtcVideoCapturer對象作爲VideoCapturer接口的實現。能夠理解成WebRtcVideoCapturer就是WebRTC原生的視頻採集的實現,但這種說法不確切,由於視頻採集涉及到跨平臺,沒這麼簡單。下面再細扒一下WebRtcVideoCapturer:ide

因爲平臺相關性,WebRtcVideoCapturer仍然不是視頻採集的真正實現,它建立一個VideoCaptureModule接口對象來完成真正的視頻採集工做。該抽象接口是視頻採集的實現接口,最終在Windows平臺下由VideoCaptureDS(傳統的DirectShow方式)和VideoCaptureMF(Vista以後的Media Foundation API實現方式)來實現採集工做。這裏要說明一下VideoCaptureMF在WebRTC中仍是個空架子,還未真正實現,若是讀者對Media Foundation API實現視頻採集感興趣,能夠參考Chromium的media庫中VideoCaptureDeviceMFWin類實現。函數

接下來分析一下VideoSourceInterface和VideoCapturer是如何結合,以及採集由誰驅動開始的。spa

VideoSource是WebRTC對VideoSourceInterface接口的實現, 它容納一個VideoCapturer對象作爲視頻採集源,VideoRenderer是供外部從VideoSource中獲取視頻幀數據。此外VideoSource還依賴ChannelManager對象,使用它所包含的CaptureManager來負責視頻的採集任務。VideoSource在建立的時候就會調用 Initialize方法中調用ChannelManager的StartVideoCapture方法開始採集視頻數據。CaptureManager內部爲每一個VideoCapturer對象維護了一個CaptureRenderAdapter,CaptureRenderAdapter在建立的時候將OnVideoFrame成員方法掛接上VideoCapturer的SignalVideoFrame信號來實時接收採集源傳送過來的視頻幀數據,OnVideoFrame內部將接收到的視頻幀數據分發給向其註冊的VideoRenderer對象(VideoRenderer對象的註冊的流程是VideoSource到ChannelManager,再到CaptureManager,最後註冊到CaptureRenderAdapter與特定的VideoCapturer關聯)。設計

至此,VideoSourceInterface在WebRTC中的實現已經很清晰了,視頻採集的流程和時機也很明瞭,接下來順便稍等地簡單分析一下WebRTC中VideoTrackInterface接口的實現:3d

WebRTC建立了一個VideoTrack實現VideoTrackInterface接口,在此以前我一直有個疑問,VideoTrackInterface對外暴露的視頻輸出接口是VideoRendererInterface,而視頻源接口VideoSourceInterface對外暴露的視頻輸出接口是VideoRenderer,兩套接口是如何適配的。看到這裏,我發現原來VideoTrack新建了一個VideoTrackRenderers對象來完成VideoRendererInterface接口到VideoRenderer接口的適配工做。VideoTrackRenderers一方面從VideoRenderer接口派生,這樣就能夠將本身經過VideoSourceInterface的AddSink方法掛接進去來接收視頻幀數據,另外一方面將接收到的視頻幀數據分發給外部掛接給VideoTrackInterface的VideoRendererInterface接口。視頻

2. Chromium對WebRTC的視頻採集適配

Chromium建立WebRtcVideoCapturerAdapter類來實現VideoCapturer接口,相關結構以下:htm

Chromium本身也封裝了Track、Source概念,因此當初看這塊的時候腦殼不容易轉彎費了很多心思。WebRtcVideoCapturerAdapter須要接收Chromium的視頻採集模塊傳輸過來的幀數據,經過一層層的掛接,最終掛接到MediaStreamVideoSource類中。MediaStreamVideoSource接收到視頻幀數據時,再一層層地通知回來,最終通知到WebRtcVideoCapturerAdapter的OnFrameCaptured方法,該方法內部觸發SignalFrameCaptured信號。

MediaStreamVideoSource封裝了Chromium視頻採集的入口,這塊結構就複雜了,牽涉到跨進程的架構,以下:

這部分不打算細說,若是細說就極可能混淆到目前爲止創建的僅有的一點點概念了,本節主要是介紹的是Chromium對WebRTC視頻採集接口的定製。

相關文章
相關標籤/搜索