webrtc--AudioProcessing的使用

本文详细介绍了AudioProcessing组件的实例化配置及工作流程。包括各模块的启用与参数设置、音频流处理过程中的关键步骤,以及如何正确释放资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.AudioProcessing的实例化和配置:    

AudioProcessing* apm = AudioProcessing::Create(0);


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的内部状态,用于开始处理一个新的音频流。第一个流创建之后不一定需要调用此方法。


2.AudioProcessing的工作流程:

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的人声优先概率。


3.AudioProcessing 的释放

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

### WebRTC 中 AGC(自动增益控制)功能的 C++ 使用教程 在 WebRTC 的音频处理模块中,AGC 是一项重要的功能,用于动态调整麦克风输入音量以保持一致的声音水平。以下是关于如何在 C++ 中使用 WebRTC 的 AGC 功能的相关说明。 #### 1. 初始化 AudioProcessing 模块 WebRTC 提供了一个名为 `AudioProcessing` 的核心模块来管理各种音频增强功能,包括 AEC(回声消除)、NS(噪声抑制)以及 AGC(自动增益控制)。要启用这些功能,首先需要初始化该模块并配置其参数。 ```cpp #include "api/audio/audio_processing_builder.h" #include "modules/audio_processing/include/audio_processing.h" rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing = webrtc::AudioProcessingBuilder().Create(); if (!audio_processing) { // 处理创建失败的情况 } ``` 上述代码片段展示了如何通过 `AudioProcessingBuilder` 创建一个 `AudioProcessing` 对象实例[^1]。 #### 2. 启用和配置 AGC 功能 一旦成功初始化了 `AudioProcessing` 模块,就可以进一步设置具体的子模块选项。对于 AGC 来说,可以通过调用相应的 API 方法实现开启或关闭操作: ```cpp // 获取指针以便访问内部组件接口 webrtc::AudioProcessing* apm = audio_processing.get(); // 设置模式为 kAdaptiveAnalog 表示自适应模拟增益调节方式; bool result = apm->gain_control()->Enable(true); result &= apm->gain_control()->set_mode( webrtc::GainControl::Mode::kAdaptiveDigital); if (result) { std::cout << "Successfully enabled and configured AGC." << std::endl; } else { std::cerr << "Failed to enable or configure AGC." << std::endl; } ``` 这里选择了数字域内的自适应增益控制策略 (`kAdaptiveDigital`) 而不是传统的模拟电路级方案(`kFixedDigital`, `kAdaptiveAnalog`) ,因为前者通常能提供更好的性能表现[^4]。 #### 3. 数据流接入与处理流程集成 完成以上准备工作之后,在实际应用过程中还需要考虑如何将原始采集的数据送入 AP Module 并获取经过优化后的输出样本序列。这一步骤涉及到对每帧 PCM 编码格式声音数据的操作逻辑设计。 假设已经拥有了来自硬件设备驱动层读取得到的一段缓冲区内容,则可以按照如下方式进行传递给 WebRTC 进行实时预处理: ```cpp const int sample_rate_hz = 16000; // 示例采样率设定值 unsigned char input_buffer[FRAME_SIZE]; // 输入缓存定义大小需匹配具体需求场景 float output_buffer[FRAME_SIZE]; // 输出浮点型数组存储最终结果 // 将字节形式转换成适合运算的标准数值表示法(短整型) int16_t pcm_samples[NUM_SAMPLES]; for(int i=0;i<NUM_SAMPLES;++i){ pcm_samples[i]=static_cast<int16_t>(input_buffer[i]); } // 执行单次完整的语音信号链路分析合成过程 apm->ProcessStream(pcm_samples, sample_rate_hz ,output_buffer ); ``` 此部分实现了从原始二进制位串到标准化量化单位之间的映射关系建立,并且利用 ProcessStream 函数完成了整个框架下的各项修正措施执行动作[^2]。 --- ### 注意事项 尽管上面给出了一套较为通用的技术路线指导方针,但在真实项目开发阶段仍有许多细节值得深入探讨研究。例如不同平台架构下可能存在的兼容性差异问题;或者针对特定业务诉求定制化扩展现有基础能力等等都需要额外投入精力解决。 此外值得注意的是,虽然本文重点讨论了基于 C++ SDK 版本的解决方案,但对于其他编程环境而言也可能存在类似的机制可供借鉴参考[^3]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值