混音分为服务端混音和客户端混音两种。服务器端混音是为了节省带宽,客户端混音是因为声卡同一时刻只能播放一路的语音,当你的客户端有多路语音接入时,如果不先进行混音,而是每一路都直接输入到声卡,则会造成声音延时越来越严重。
每一种编解码标准都有相应的采样频率,在不同的ChannelID之间的语音进行混音的时候,首先需要比较每一路的采样频率,如果采样频率不同,则需要进行重新采样为统一的频率,才能进行正常的混音操作。
WebRTC中目前只有客户端混音,混音具体实现是在\src\modules\audio_mixer目录中。
1.创建混音对象

2.把多路音源添加到audio_source_list_

3.开始混音调用modules/audio_mixer/audio_mixer_impl.cc AudioMixerImpl::Mix()函数

4.混音算法在Combine函数

Combine方法调用MixToFloatFrame进行合并, MixToFloatFrame只是简单的把数据相加, 然后调用RunApmAgcLimiter或RunApmAgc2Limiter对混音结果进行增益处理, 同时防止溢出。然后调用InterleaveToAudioFrame根据音频声道交织处理混音结果。混音的结果存储在audio_frame_for_mixing中.
网友评论