1. 程式人生 > >WebRTC原始碼分析二:音訊模組結構

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);

      播放裝置配置類似。