WebRTC手記之本地音頻採集

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

上一篇博文介紹了本地視頻採集,這一篇就介紹下音頻採集流程,也是先介紹WebRTC原生的音頻採集,再介紹Chromium源碼對它的定製。架構

1. WebRTC原生音頻採集

先介紹一下WebRTC中與音頻採集貌似相關的接口概念:框架

結構上看起來是否是和視頻Track的結構相似?不過前面提過,若是你以對稱的思惟,在此結構中找出與視頻track類似的採集源和輸出源,那就確定無功而返了,LocalAudioSource對AudioSourceInterface的實現就是一個空實現,沒有了音頻源,那音頻處理接口AudioProcessorInterface和輸出接口AudioRenderer都成了無米之炊了。這些接口先擺在這,可能相似於AudioCapturer的框架正在實現的途中,也可能這些接口有別的用處,好比遠程音頻流的抽象等,這裏就暫且擱置,先記下有這回事吧。這裏只談WebRTC本地音頻的採集處理。前面介紹音視頻接口的時候也提到的,本地音頻的採集由AudioDeviceModule接口統一封裝:spa

AudioDeviceModule是個大而全的接口,巴不得將全部音頻相關的接口都封裝在裏面(實際也差很少了),具體包括:枚舉音頻採集設備(Record)和播放設備(Playout)、設置當前的採集設備/播放設備、開始/中止音頻的採集/播放、設置音頻增益控制開關(AGC)等。AudioTransport是個關鍵的對外接口,負責音頻數據的傳入(調用NeedMorePlayData方法,供Playout使用)和輸出(調用RecordedDataIsAvailable方法,數據由Record採集操做產生)。設計

AudioDeviceModuleImpl實現了AudioDeviceModule接口,建立的時候調用CreatePlatformSpecificObjects方法建立平臺相關的AudioDeviceGeneric接口實現。該接口抽象了音頻的採集和播放邏輯,在Windows平臺下有兩種實現方案:3d

  •   AudioDeviceWindowsWave實現的是傳統的Windows Wave APIs方案。
  •  AudioDeviceWindowsCore實現的是Vista以後才支持的Windows Core Audio APIs方案。

此外,AudioDeviceModuleImpl還維護了一個AudioDeviceBuffer對象來管理音頻數據的緩衝區,由它直接與對外接口AudioTransport交互。好比:orm

  •  當AudioDeviceWindowsWave或者AudioDeviceWindowsCore須要播放音頻數據的時候,會調用AudioDeviceBuffer的RequestPlayoutData方法請求播放數據,而後經過GetPlayoutData方法來獲取剛請求到的數據。AudioDeviceBuffer的RequestPlayoutData就是調用AudioTransport接口的NeedMorePlayData方法來請求待播放的音頻流數據。
  •  當AudioDeviceWindowsWave或者AudioDeviceWindowsCore採集到音頻數據後,會調用AudioDeviceBuffer的SetRecordedBuffer方法將採集到的音頻數據傳遞進去,而後調用DeliverRecordedData方法來派發出去,該派發方法就是經過調用AudioTransport接口的RecordedDataIsAvailable來實現。

總之,音頻採集模塊到處都透露出大而全的結構設計。若是能夠,真的應該細化一下概念設計,好比將音頻採集和音頻播放邏輯分離、音頻輸入和輸出的接口拆分等等,那樣才能談得上結構設計。視頻

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

根據WebRTC的本地音頻接口設計,Chromium提供了一個WebRtcAudioDeviceImpl類來實現AudioDeviceModule接口,該類對象由PeerConnectionDependencyFactory負責建立和維護,結構以下:htm

如圖所示,WebRtcAudioDeviceImpl摒棄了原生的AudioDeviceModuleImpl實現中大而全的設計,而是將音頻採集和音頻渲染邏輯分開,分別對應於WebRtcAudioCapturer和WebRtcAudioRenderer。WebRtcAudioRenderer經過WebRtcAudioRendererSource接口的RenderData方法向WebRtcAudioDeviceImpl請求音頻流數據來渲染,WebRtcAudioDeviceImpl將該請求轉發給前面提到的對外交互接口AudioTransport。WebRtcAudioCapturer封裝音頻採集邏輯,它將採集到的數據經過WebRtcLocalAudioTrack對象所持有的PeerConnectionAudioSink接口派發出去,WebRtcAudioDeviceImpl正是實現了該接口來接收音頻採集數據,而後也是經過AudioTransport接口往外傳遞。至於WebRtcAudioCapturer對象的持有者MediaStreamAudioSource和WebMediaStreamTrack,這裏暫時有個概念就行,它們是Chromium對HTML5媒體流的實現接口。接下來仔細分析一下WebRtcAudioCapturer和WebRtcAudioRenderer兩個關鍵類,毋庸置疑,它們都涉及到了特定平臺實現,並且在Chromium中還跨越了Render和Browser進程。和介紹Chromium視頻採集的模式同樣,因爲不是本文重點,這裏只列出結構圖,不打算詳解,若是你有開發上的須要,能夠照着該結構圖細看源碼。對象

這是WebRtcAudioCapturer採集音頻數據的結構,牽涉到跨進程通訊,結構仍是很是複雜的。WebRtcAudioRenderer的結構就不許備介紹了,由於Chromium的這塊設計很是具有對稱性,基本上圖中類命名中的Input改爲Output就差很少是WebRtcAudioRenderer的架構了。

相關文章
相關標籤/搜索