WebRTC手記之本地視頻采集


轉載請注明出處:http://www.cnblogs.com/fangkm/p/4374610.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:

由於平台相關性,WebRtcVideoCapturer仍然不是視頻采集的真正實現,它創建一個VideoCaptureModule接口對象來完成真正的視頻采集工作。該抽象接口是視頻采集的實現接口,最終在Windows平台下由VideoCaptureDS(傳統的DirectShow方式)和VideoCaptureMF(Vista之后的Media Foundation API實現方式)來實現采集工作。這里要說明一下VideoCaptureMF在WebRTC中還是個空架子,還未真正實現,如果讀者對Media Foundation API實現視頻采集感興趣,可以參考Chromium的media庫中VideoCaptureDeviceMFWin類實現。

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

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接口的實現:

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

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

Chromium創建WebRtcVideoCapturerAdapter類來實現VideoCapturer接口,相關結構如下:

Chromium自己也封裝了Track、Source概念,所以當初看這塊的時候腦袋不容易轉彎費了不少心思。WebRtcVideoCapturerAdapter需要接收Chromium的視頻采集模塊傳輸過來的幀數據,通過一層層的掛接,最終掛接到MediaStreamVideoSource類中。MediaStreamVideoSource接收到視頻幀數據時,再一層層地通知回來,最終通知到WebRtcVideoCapturerAdapter的OnFrameCaptured方法,該方法內部觸發SignalFrameCaptured信號。

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

這部分不打算細說,如果細說就很可能混淆到目前為止建立的僅有的一點點概念了,本節主要是介紹的是Chromium對WebRTC視頻采集接口的定制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM