天天看点

WebRTC音频处理流程简介

本文概要介绍webRTC的音频处理流程,见下图:

WebRTC音频处理流程简介

webRTC将音频会话抽象为一个通道(Channel),譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输。上图中有三个Channel,每个Channel包含编解码和实时传输协议(Real-time Transport Protocol,RTP)/实时传输控制协议(Real-time Control Protocol,RTCP)发送功能。

以一个Channel而言,应用程序中将包含三个活动线程,录音线程,音频接收线程和播放线程。

1)录音线程:负责麦克风音频的采集,见图中红色路径,采集到音频后,缓存到一定长度,进行音频处理,主要包括AEC,AGC和NS等。然后送到Channel,经过音频Codec模块编码,封装成RTP包,通过Socket发送出去;

2)接收线程:见蓝色路径,负责接收远端发送过来的音频包,解封RTP包,解码音频数据,送入NetEQ模块缓存。

3)播放线程:负责耳机声音播放,见绿色路径。播放线程去OutMixer中获取要播放的音频数据,首先依次获取参与会话的Channel中NetEQ存储的音频帧,可以对其做AGC和NS处理;然后混合多个Channel的音频信号,得到混合音频,传递给AudioProcessing模块进行远端分析。最后播放出来。

如下为本地回环录音和播放代码:

[cpp]   view plain  copy

  1. VoiceEngine* ve = VoiceEngine::Create();  
  2. VoEBase* base = VoEBase::GetInterface(ve);  
  3. base->Init();  
  4. int chId = base->CreateChannel();  
  5. base->SetSendDestination(chId,3000,"127.0.0.1",4000);  
  6. base->SetLocalReceiver(chId,3000,3001,"127.0.0.1");  
  7. base->StartPlayout(chId);  
  8. base->StartReceive(chId);  
  9. base->StartSend(chId);  
  10.         //....sleep...wait.....  
  11. base->StopSend(chId);  
  12. base->StopReveive(chId);  
  13. base->StopPlayout(chId);  
  14. base->Terminate();  

继续阅读