webrtc中APM(AudioProcessing module)的使用

来源:互联网 发布:淘宝哪家店铺零食好吃 编辑:程序博客网 时间:2024/05/01 23:47

webrtc博大精深,刚接触不久,望各位多多支持,虽然本篇文章标注为原创,但是里面某些内容肯定要借鉴大神文章,这里不一一赘述,望见谅。


一,实例化和配置

AudioProcessing* apm = AudioProcessing::Create(0); //这里的0指的是channelID,只是一个标注那个通道的表示

apm->level_estimator()->Enable(true);//启用重试次数估计组件

apm->echo_cancellation()->Enable(true);//启用回声消除组件

apm->echo_cancellation()->enable_metrics(true);//

apm->echo_cancellation()->enable_drift_compensation(true);//启用时钟补偿模块(声音捕捉设备的时钟频率和播放设备的时钟频率可能不一样)

apm->gain_control()->Enable(true);//启用增益控制组件,client必须启用哦!

apm->high_pass_filter()->Enable(true);//高通过滤器组件,过滤DC偏移和低频噪音,client必须启用

apm->noise_suppression()->Enable(true);//噪声抑制组件,client必须启用

apm->voice_detection()->Enable(true);//启用语音检测组件,检测是否有说话声

apm->voice_detection()->set_likelihood( VoiceDetection::kModerateLikelihood);//设置语音检测的阀值,阀值越大,语音越不容易被忽略,同样一些噪音可能被当成语音。

apm->Initialize();//保留所有用户设置的情况下重新初始化apm的内部状态,用于开始处理一个新的音频流。第一个流创建之后不一定需要调用此方法。


二,工作流程

AudioProcessing也是事件驱动的,事件分为初始化事件、捕捉音频事件、渲染音频事件。

初始化事件:

apm->set_sample_rate_hz(sample_rate_hz);//设置本地和远程音频流的采样率。

apm->echo_cancellation()->set_device_sample_rate_hz();//设置音频设备的采样率,我们假定音频采集和播放设备采用同样的采样率。(drift组件启用时必须调用)。

 apm->set_num_channels(num_capture_input_channels, num_capture_output_channels);//设置本地和远程音频流的通道数。


播放事件:

apm->AnalyzeReverseStream(&far_frame));//分析远端音频流的10ms的frame数据,这些数据为回声抑制提供参考。(启用回声抑制的时候需要调用)


捕捉事件:

apm->gain_control()->set_stream_analog_level(capture_level);

apm->set_stream_delay_ms(delay_ms + extra_delay_ms);//设置本地和远端音频流之间的延迟,单位毫秒。这个延迟是远端音频流和本地音频流之间的时差,计算方法为:

delay = (t_render - t_analyze) + (t_process - t_capture)

其中

t_analyze是远端音频流交给AnalyzeReverseStream()方法的时间;

t_render是与刚才同样的远端音频frame的播放时间;

t_capture是本地音频frame捕捉的时间;

t_process是同样的本地音频frame被交给ProcessStream()方法的时间。

 apm->echo_cancellation()->set_stream_drift_samples(drift_samples);//设置音频设备捕捉和播放的采样率的差值。(drift组件启用时必须调用)

int err = apm->ProcessStream(&near_frame);//处理音频流,包括各个环节的处理。(如增益调节、回声消除、噪声抑制、语音检测、高通过率等,没有解码哦!是针对pcm数据做处理的)

capture_level = apm->gain_control()->stream_analog_level();//模拟模式下,必须在ProcessStream之后调用此方法,获取新的音频HAL的推荐模拟值。

stream_has_voice =apm->voice_detection()->stream_has_voice();//检测是否有语音,必须在ProcessStream之后调用此方法

ns_speech_prob = apm->noise_suppression()->speech_probability();//返回内部计算出的当前frame的人声优先概率。


三,释放和资源回收

AudioProcessing::Destroy(apm);
apm = NULL;


四,webrtc中自带例子测试

webrtc工程项目组有个audioproc项目,是测试APM模块的,不要要指定测试文件和参数,详情可以看里面的--hlep选项。





1 0
原创粉丝点击