一,实例化和配置

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的播放时间;

elesos注:render-aanalyze感觉就是远端音频处理的时间,从其开始处理到最终渲染的这一段时间。而

process-capture感觉就是近端,从采集到开始处理的这段时间。时差就是双方的和。

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之后调用

此方法,elesos注:可参考Audio_processing.h

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

三,释放和资源回收

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

四,webrtc中自带例子测试

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

elesos注:https://code.google.com/p/webrtc-audioproc/  移到

https://github.com/DoubangoTelecom/webrtc-audioproc  (WebRTC AudioProc (AEC, VAD, NS...))

参考:

webrtc中APM(AudioProcessing module)的使用的更多相关文章

  1. webrtc中APM(AudioProcessing module)的使用2

    这个其实就是从Audio_processing.h中拿出来的. APM should be placed in the signal chain as close to the audio hardw ...

  2. android studio 中移除module和恢复module

    一.移除Android Studio中module 在Android Studio中想要删除某个module时,在Android Studio中选中module,右键发现没有delete,如图: An ...

  3. Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析

    本文主要介绍WebRTC中丢包重传NACK的实现,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...

  4. Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析

    本文主要介绍WebRTC中的RTP/RTCP协议,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...

  5. webrtc中的带宽自适应算法

    转自:http://www.xuebuyuan.com/1248366.html webrtc中的带宽自适应算法分为两种: 1, 发端带宽控制, 原理是由rtcp中的丢包统计来动态的增加或减少带宽,在 ...

  6. Node.js中exports,module.exports以及require方法

    在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是, ...

  7. WebRTC中的NetEQ

    NetEQ使得WebRTC语音引擎能够快速且高解析度地适应不断变化的网络环境,确保了音质优美且缓冲延迟最小,其集成了自适应抖动控制以及丢包隐藏算法. WebRTC和NetEQ概述 WebRTC Web ...

  8. [转载]Pytorch中nn.Linear module的理解

    [转载]Pytorch中nn.Linear module的理解 本文转载并援引全文纯粹是为了构建和分类自己的知识,方便自己未来的查找,没啥其他意思. 这个模块要实现的公式是:y=xAT+*b 来源:h ...

  9. ULPFEC在WebRTC中的实现[转载]

    一.WebRTC对抗网络丢包的两种手段     丢包重传(NACK)和前向纠错(FEC).FEC是一种前向纠错技术,发送端将负载数据加上一定的冗余纠错码一起发送,接收端根据接收到的纠错码对数据进行差错 ...

随机推荐

  1. 多材质(Shader)实现

    最近在cocos creator上打算写个U3D中shader功能的插件(能在属性面板调整shader属性). 对其中一个功能有点疑惑,就是U3D中一个渲染物体上可以挂多个材质,后来查询了下,一个物体 ...

  2. Linux下实现秒级的crontab定时任务

    crontab的格式如下 * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 ...

  3. Array的个人总结

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  4. jQuery中10个非常有用的遍历函数

    使用jQuery,可以 很容易的选择HTML元素.但有些时候,在HTML结构较为复杂时,提炼我们选择的元素就是一件麻烦的事情.在这篇教程中,我们将探讨十种方 法去精炼和扩展我们将要操作的集合. HTM ...

  5. 创伤后应激障碍(PTSD)

    创伤后应激障碍(Post Traumatic Stress Disorder,PTSD)又称延迟性心因性反应(Delayed Psychogenic Reaction),是由应激性事件或处境而引起的延 ...

  6. angularJs 控制文本长度,超出省略号过滤器

    1.控制文本长度,超出省略号 在模版中: <label>{{item.abbr| cut:true:20:' ...' }}<label> js: angular.module ...

  7. BZOJ 2091: [Poi2010]The Minima Game

    Description 每次可以任取数字,使用最优策略让差最大. Sol DP. 一开始我写了个单调队列贪心,然后狂WA不止... 正着做有后效性,因为前面的决策无法保证在后面是最优秀的,但如果倒这做 ...

  8. 浅谈CPU和GPU的区别

    导读: CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景.CPU需要很强的通用性来处理各种不同的数据类型,而GPU面对的则是类型高度统一的.相互无依赖的大规模数据 ...

  9. nginx windows负载均衡入门

    前言 做了几年开发,都是只管码代码,没有参与过项目的部署,为了知识体系更加完整,于是开始学习一下负载均衡.查了一下资料,觉得用nginx +iis 比较简单,于是小试牛刀. 步骤 准备工作 下载ngi ...

  10. Can I Win

    In the "100 game," two players take turns adding, to a running total, any integer from 1.. ...