WebRtc VoiceEngine代码解析 (二)

2014-11-24 10:21:36 · 作者: · 浏览: 3
r->InputIsOnHold())
{
channelPtr->UpdateLocalTimeStamp();
} else if (channelPtr->Sending())
{
// Demultiplex makes a copy of its input.
channelPtr->Demultiplex(_audioFrame);
channelPtr->PrepareEncodeAndSend(_audioFrame.sample_rate_hz_);
}
channelPtr = sc.GetNextChannel(iterator);
}

}

TransmitMixer::DemuxAndMix()
{
Channel* channelPtr = sc.GetFirstChannel(iterator);
while (channelPtr != NULL)
{
if (channelPtr->InputIsOnHold())
{
channelPtr->UpdateLocalTimeStamp();
} else if (channelPtr->Sending())
{
// Demultiplex makes a copy of its input.
channelPtr->Demultiplex(_audioFrame);
channelPtr->PrepareEncodeAndSend(_audioFrame.sample_rate_hz_);
}
channelPtr = sc.GetNextChannel(iterator);
}

}
Channel::Demutiplex(),基本上没有什么具体任务,就是把audioFrame里边的数据拷贝到channel自身, webrtc是client解决方案,对于client只认为有一个audio source,但可以有多个channel,每个channel中都有audio process,所以需要把数据copy到每个channel.

只有就是数据处理 PrepareEncodeAndSend()


[cpp]
Channel::PrepareEncodeAndSend(int mixingFrequency)
{
if (_inputFilePlaying)
{
MixOrReplaceAudioWithFile(mixingFrequency); //如果使用了voeFile::PlayFileAsMic();则从文件读取10ms数据,并覆盖audio buffer
}

if (_mute)
{
AudioFrameOperations::Mute(_audioFrame);//当然如果设置mutex,则memset 0
}
if (_inputExternalMedia)
{
_inputExternalMediaCallbackPtr->Process(); //所过设置了ExternalMedia,自己的audio处理过程,就是在这里调用的
}
InsertInbandDtmfTone(); //添加DTMF音频
_rtpAudioProc->ProcessStream(&_audioFrame); // 真正的GIPS牛逼代码,audio process过程: Aec Aecm AGC
}

Channel::PrepareEncodeAndSend(int mixingFrequency)
{
if (_inputFilePlaying)
{
MixOrReplaceAudioWithFile(mixingFrequency); //如果使用了voeFile::PlayFileAsMic();则从文件读取10ms数据,并覆盖audio buffer
}

if (_mute)
{
AudioFrameOperations::Mute(_audioFrame);//当然如果设置mutex,则memset 0
}
if (_inputExternalMedia)
{
_inputExternalMediaCallbackPtr->Process(); //所过设置了ExternalMedia,自己的audio处理过程,就是在这里调用的
}
InsertInbandDtmfTone(); //添加DTMF音频
_rtpAudioProc->ProcessStream(&_audioFrame); // 真正的GIPS牛逼代码,audio process过程: Aec Aecm AGC
}
int AudioProcessingImpl::ProcessStream(AudioFrame* frame) 就是上述调用的_rtpAudioProc->ProcessStream();


以上是DemuxAndMix()过程,之后就是EncodeAndSend()过程,至此整个voe数据处理流程分析结束;

关于Audio Process则是另外一个大话题;


总结一下几点:

1. VoeBase提供大部分的对外接口

2. Channel:继承了大部分的音频功能;