WebRTC原始碼分析二:音訊模組結構
本文介紹WebRTC音訊模組組成和結構,詳細介紹音訊引擎的配置和啟動,相信看完本文後,很多人可以利用WebRTC完成一個音訊通話程式開發。
一、對外介面
音訊部分的對外主要介面如下,各個介面之間的關係如圖1所示。
1)VoiceEngine:負責引擎的所有介面查詢,儲存共享資料資訊ShareData。
2)VoEBase:負責音訊處理的基本操作。
3)VoEAudioProcessing:音訊訊號處理介面,設定各個音訊處理項的引數。
4)VoECodec:音訊編解碼介面,提供支援的編解碼器查詢,音訊編解碼設定。
5)VoEHardware:音訊硬體裝置介面,負責音訊硬體裝置的設定。
其它的介面還有VoENetEqStats,VoENetwork,VoERTP_RTCP,VoEVideoSync,VoEVolumeControl,VoEFile,VoECallReport,VoEDtmf,VoEMeidaProcess和VoEEncryption。
WebRTC使用繼承實現介面轉換和查詢,介面之間的資料共享是通過ShareData完成,首先VoiceEngineImpl繼承各個對外介面的實現,所以可以從VoiceEngineImpl很容易獲取其他對外介面。而VoiceEngineImpl本身也繼承ShareData,當從VoiceEngineImpl獲取其他對外介面的同時,隱式的傳遞了ShareData指標,因此各個介面可以很方便的獲取到ShareData的資料資訊。因此雖然類與類之間的關係看起來比較混亂,但是使用上比較方便。
利用VoiceEngine獲取對外介面:VoEInterfaceXX* pInterf = VoEInterfaceXX:GetInterface(pVoiceEngine);
圖(1)介面關係示意圖
二、模組組成
圖(2)模組組成和關係示意圖
主要由五大模組組成:AudioDeviceModule音訊裝置模組,AudioProcess音訊處理模組,AudioCodingModule音訊編碼模組,AudioConferenceMixer混音模組和RtpRtcp傳輸模組。
ShareData用於粘合各個模組之間的關係,負責管理全域性的物件,包括AudioDeviceModule,TransmitMixer,OutputMixer,ChannelManager和AudioProcess。
錄音流程:AudioDeviceWinCore負責採集音訊資料,傳遞到AudioDeviceBuffer中快取,AudioDeviceBuffer則將資料送入TransmixMixer,首先交給AudioProcess進行近端音訊處理,完成後分發到各個Channel中,Channel則通過AudioCodingModule進行編碼,編碼後再交付到RtpRtcp中經由RTPSender傳送出去。
接收流程:RTPReceiver負責接收音訊RTP包,接收到RTP包後交給Channel,Channel轉交給AudioCodingModule中的ACMNetEQ模組,進行解碼快取。
播放流程:Channel從ACMNetEQ模組中取出快取的解碼音訊資料,如果需要進行遠端資料處理的話,傳遞給AudioProcess處理。最後所有Channel都匯入到OutputMixer中進行混音,混音後再傳遞到AudioProcess進行遠端音訊分析。最後送入AudioDeviceModule中的AudioDevceWinCore播放。
三、配置
1、音訊引擎建立與刪除
VoiceEngine*pVoeEngine = VoiceEngine::Create();
VoiceEngine::Delete(pVoeEngine);
2、音訊收發
1)音訊通話鏈路建立
WebRTC中的Channel,為一路音訊。作為網路語音通訊,至少要建立一路音訊Channel。
Channel沒有提供對外介面,是有VoEBase來管理的,通過索引號來選定對應的Channel。
VoEBase*base = VoEBase::GetInterface(pVoeEngine);
int ch0 =base->CreateChannel();
2)網路埠設定
音訊通過RTP和RTCP傳送出去,RTP和RTCP使用UDP實現,需要配置網路埠和地址。
//設定傳送給.2機器的3000埠
base->SetSendDestination(ch0,3000,”192.168.8.2”);
//在本機的3000埠接收RTP包
base->SetLocalReceiver(ch0,3000);
3)音訊編碼選擇
VoECodec負責編解碼的配置。
VoECodec*codec = VoEBase::GetInterface(pVoeEngine);
設定Channel的編碼型別之前,要查詢支援的編碼列表。
CodecInstinst;
Intnum = codec->NumOfCodecs();
for(int i=0; i<num; ++i)
{
Codec->GetCodec(I,inst);
//列印編碼資訊
}
//設定編碼0
Codec->GetCodec(0,inst);
Codec->SetSendCodec(ch0,inst);
WebRTC自動識別編碼型別,因此解碼不需要設定。
4)啟動
啟動播放:base->StartPlayout(ch0);該操作含義是將通話ch0進行混音輸出。
啟動接收:base->StartReceive(ch0);開始接收後,每增加一路通話,引擎會將音訊進行混音再輸出。
啟動傳送:base->StartSend(ch0);啟動傳送的時候,會檢查是否正在錄音,如果已經開啟錄音,則不再開啟;否則會執行音訊裝置錄音操作。
3、音訊處理的配置
VoEAudioProcessing負責音訊處理的配置。
VoEAudioProcessing*pAudioProc = VoEAudioProcessing::GetInterface(pVoeEngine);
//啟動AGC功能
pAudioProc->SetAgcStatus(true);
4、音訊裝置的配置
VoEHardware介面可以檢視錄音和播放裝置,可以選擇指定的裝置進行音訊通話。
VoEHardware*pHardware=VoEAudioProcessing::GetInterface(pVoeEngine);
Int numin =pHardware->GetNumOfRecordingDevices();
For(int i=0;i<numin; ++i)
{
pHardware->GetRecordingDeviceNames(…)
//列印錄音裝置
}
//選擇裝置0作為錄音裝置
pHardware->SetRecordingDevice(0);
播放裝置配置類似。