Webrtc音頻引擎(一步一步讀代碼)

WebRTC音頻引擎的實現代碼主要分佈在如下幾個源碼目錄中:

webrtc/audio
webrtc/common_audio
webrtc/media/engine
webrtc/voice_engine
//音頻編解碼
webrtc/module/audio_coding
//接收端混音
webrtc/module/audio_conference_mixer
//音頻輸入輸出設備
webrtc/module/audioDevide
//音頻預處理(消迴音、自動增益、降噪等)
webrtc/module/audio_processing

語音引擎架構圖:

重要的幾個類:

VoEBaseImpl;

SharedData:聚合類,包含一些重要的對象;

Channel:負責一路音頻數據的重要操作,包括音頻數據的前處理(消迴音、降噪、自動增益)、編解碼、發送、接受、後處理(混音)

VoEBaseImpl是連接底層音頻採集播放模塊AudioDeviceModule和音頻引擎內部音頻通道Channel的重要紐帶。它實現三個接口:VoEBase負責創建Channel、啓動/停止音頻數據的發送/接收;AudioTransport負責AudioDeviceModule模塊和Channel之間數據傳送,包括採集後的音頻數據發送到Channel進行編碼、從Channel拉取解碼後的音頻數據進行播放;AudioDeviceObserver負責把AudioDeviceModule工作過程中出現的錯誤和警告向上層報告。

 

 

內容部分參考:https://www.jianshu.com/p/5a8a91cd84ef?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io


Channel是對一路音頻數據及其處理過程的抽象,是VoiceEngineImpl中最重要的底層實現類,其繼承並實現RtpData、RtpFeedback、FileCallback、Transport、PacketizationCallback、ACMVADCallback、MixerParticipant等多個接口,分別負責音頻數據編碼後回掉、發送到網絡、接收後存儲到NetEq緩衝區、播放前混音等一些列重要操作。在類內部, Channel包含的重要成員對象包括RtpReceiver、RtpRtcpModule、AudioCodingModule、CodecManager、OutputMixer、TransmitMixer、ProcessThread、AudioDeviceModule、VoiceEngineObserver、Transport、AudioProcessing、PacketRouter等等。


 AudioDeviceModule模塊負責音頻數據的採集和播放,是音頻數據的發源地和目的地。其內部主要包含三個對象:AudioDeviceModule、AudioDeviceGeneric和AudioDeviceBuffer。AudioDeviceModule是對外接口類,負責對AudioDevice和AudioDeviceBuffer進行管理、設置和對音頻數據進行傳遞。AudioDevice是平臺相關的音頻設備,它管理音頻採集設備和播放設備,包括初始化、設置音頻採集設備和播放設備、開始/停止設備、控制設備音量、設置設備的音頻數據緩衝區,等等。在初始化階段,AudioDevice創建採集線程和播放線程,用來執行採集任務和播放任務。AudioDeviceBuffer是音頻數據緩衝區,負責臨時存儲和傳遞音頻數據。


  AudioCodingModule模塊負責音頻數據的編解碼,它由音頻引擎層的Channel持有並調用。在內部,AudioCodingModul包含如下重要對象:AcmReceiver、AudioEncoder、AudioDecoder和NetEq,其中AcmReceiver負責接收音頻數據並存儲到NetEq中,NetEq負責音頻數據的抖動消除和錯誤隱藏,AudioEncoder負責音頻數據編碼,AudioDecoder負責音頻數據解碼。WebRTC支持一系列音頻編解碼器,包括CNG、G711、G722、ilbc、isac、opus等等。數據編碼完成後通過AudioPacketizationCallback接口回調到Channel進行下一步發送工作,數據解碼完成後由Channel拉取進行下一步播放工作。


Audio Processing模塊實現音頻數據的預處理操作,包括聲學回聲消除AEC、自動增益控制AGC、噪聲抑制NS、語音活動檢測VAD,等等。AudioProcessing聚合一系列子模塊實現各種音頻處理算法,其重要的對外接口由兩個:ProcessStream()和ProcessReverseStream(),前者負責採集後編碼前的音頻數據的前處理,後者播放前解碼後的音頻數據的後處理。

 

TransmitMixer用於發送端混音。OutputMixer用於接收端混音。OutputMixer在內部使用AudioConferenceMixer負責解碼後音頻數據的混音操作。

 

 

從整個音頻鏈路上來說,包含了如下幾個步驟(5個重要的底層模塊):

音頻數據的採集(AudioDeviceModule)-> 音頻數據的預處理(AudioProcessing)->音頻數據的編碼(AudioCodingModule)->音頻數據的網絡傳輸(NetEq)->音頻數據的解碼(AudioCodingModule)->終端混音(AudioConferenceMixer)

 

WebRtcMediaEngine2在MediaEngine層對底層的音視頻引擎進行封裝,分別是WebRtcVoiceEngine和WebRtcVideoEngine2。而WebRtcVoiceEngine則封裝了音頻引擎層的VoiceEngineImpl對象。VoiceEngineImpl以多繼承方式聚集一系列接口,包括SharedData、VoEAudioProcessingImpl、VoECodecImpl、VoENetworkImpl、VoEBaseImpl

 

 WebRtcMediaEngine2在MediaEngine層對底層的音視頻引擎進行封裝,分別是WebRtcVoiceEngine和WebRtcVideoEngine2。而WebRtcVoiceEngine則封裝了音頻引擎層的VoiceEngineImpl對象。VoiceEngineImpl以多繼承方式聚集一系列接口,包括SharedData、VoEAudioProcessingImpl、VoECodecImpl、VoENetworkImpl、VoEBaseImpl等等。
 

SharedData是一個聚合類,內部包括ChannelManager、AudioDeviceModule、OutputMixer、TransmitMixer、AudioProcess等對象,大部分關於VoiceEngineImpl的操作最終都會經過SharedData委託給內部對象。在創建SharedData對象時,其構造函數會創建一個名爲“VoiceProcessThread”的線程,該線程用以處理音頻引擎的週期性事務。</p>
 


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章