一,实例化和配置

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. 如何保存gnome的linux的 会话?相当于windows下的休眠?

    在关机前, 你进行的所有操作, 的集合, 就叫做你跟 linux系统 机器间的 一次 会话, 一个session. linux 可以 在关机时保存 这些session, 保存这些打开的窗口 和程序. ...

  2. LUA 学习笔记

    1.C# 与 LUAC#调用LUA比较简单,但LUA调用C#,有两种方法,一种是直接反射调用,但这种方法有局限性,比如性能低,在IOS平台无法使用反射,因此一般使用WARP方法,即把C#代码注册到LU ...

  3. Excel文件转plist文件出现的文件编码问题

    今天在测试时遇到了需要将大量整理好的Excel数据转换为plist文件的情况.百度了一下教程,发现虽然别人也遇到过类似的情况,但是有些讲的还是不够细致.所以做如下整理.   百度到的内容中有使用Mes ...

  4. html5 第一天

    html4与html5的琐碎比较,不全,第一次写,望多多包涵. 一 兼容性:html5在老版本的浏览器上也可以运行 二 实用性:HYML5都是封装的简单使用功能 三非革命性的发展 Html5向前兼容, ...

  5. IP分片详解

    IP分片是网络上传输IP报文的一种技术手段.IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组.不同的链路类型规定有不同最大长度的链路层数据帧,称为链路层MTU(最大传输单 ...

  6. Django配合使用Jquery post方法

    Django使用jQuery的post方法需要解决两个问题: 1.Django中为了防止跨站请求,在post提交时都会带上csrf_token,利用Jquery进行post请求也需要:否则就会出现40 ...

  7. 第4月第1天 makefile automake

    1. gnu make的函数调用是$,比如 $(subst ee,EE,feet on the street) 规则中“TARGETS”可以是空格分开的多个文件名 a all: echo $(subs ...

  8. Stm32F107VCT6硬件资源

    一直在用stm32系列的单片机,最近因为需要使用到以太网,所以采用了stm32f107vc这款芯片.对于存储资源一直不是非常清楚,今天专门到官网看了一下. 如下: RAM------>64kB ...

  9. the operation was attempted on an empty geometry Arcgis Project异常

    处理gis数据,投影变换时出现异常: the operation was attempted on an empty geometry 解决思路: arcgis的repair geometry方法:删 ...

  10. 【Unity3d】火炬之光的X射线效果

    http://www.cnblogs.com/dosomething/archive/2012/04/03/2431149.html 人物和摄像机之间存在例如墙壁等的阻挡时  可以修改阻挡材质的alp ...