webrtc:音頻處理流程

轉載:http://blog.csdn.net/neustar1/article/details/19200489


本文概要介紹WebRTC的音頻處理流程,見下圖

webRTC將音頻會話抽象爲一個通道Channel,譬如A與B進行音頻通話,則A需要建立一個Channel與B進行音頻數據傳輸。上圖中有三個Channel,每個Channel包含編解碼和RTP/RTCP發送功能。

以一個Channel而言,應用程序中將包含三個活動線程,錄音線程,音頻接收線程和播放線程。

1)錄音線程:負責麥克風音頻的採集,見圖中紅色路徑,採集到音頻後,緩存到一定長度,進行音頻處理,主要包括EC,AGC和NS等。然後送到Channel,經過音頻Codec模塊編碼,封裝成RTP包,通過Socket發送出去;

2)接收線程:見藍色路徑,負責接收遠端發送過來的音頻包,解封RTP包,解碼音頻數據,送入NetEQ模塊緩存。

3)播放線程:負責耳機聲音播放,見綠色路徑。播放線程去OutMixer中獲取要播放的音頻數據,首先依次獲取參與會話的Channel中NetEQ存儲的音頻幀,可以對其做AGC和NS處理;然後混合多個Channel的音頻信號,得到混合音頻,傳遞給AudioProcessing模塊進行遠端分析。最後播放出來。

如下爲本地迴環錄音和播放代碼:

VoiceEngine* ve = VoiceEngine::Create();
VoEBase* base = VoEBase::GetInterface(ve);
base->Init();
int chId = base->CreateChannel();
base->SetSendDestination(chId,3000,"127.0.0.1",4000);
base->SetLocalReceiver(chId,3000,3001,"127.0.0.1");
base->StartPlayout(chId);
base->StartReceive(chId);
base->StartSend(chId);

        //....sleep...wait.....

base->StopSend(chId);

base->StopReveive(chId);

base->StopPlayout(chId);

base->Terminate();


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