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--AudioProcessing的使用的更多相关文章

  1. 单独编译使用WebRTC的音频处理模块

    块,每块个点,(12*64=768采样)即AEC-PC仅能处理48ms的单声道16kHz延迟的数据,而 - 加载编译好的NS模块动态库 接下来只需要按照 此文 的描述在 android 的JAVA代码 ...

  2. Arch系统软件列表

    1. 安装统计 2. 安装列表 3. 安装说明 4. 作为依赖项的安装列表 5. 更正 mangaro使用减的方式安装系统.开箱即用的豪华版本,大部分人需要的都有了,同样包括个别用户不需要的,配置方面 ...

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

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

  4. webrtc中APM(AudioProcessing module)的使用

    一,实例化和配置 AudioProcessing* apm = AudioProcessing::Create(0); //这里的0指的是channelID,只是一个标注那个通道的表示 apm-> ...

  5. WebRTC录音(1)-实现通话双向录音

    最近公司的iPad项目中一个功能点涉及到了VOIP通讯中的录音,需要在已有的WebRTC引擎中增加录音功能,录制通话双方的声音参考了往上一位兄弟的博文(链接在此 http://blog.csdn.ne ...

  6. WebRtc VoiceEngine代码解析

    WebRtc中VoiceEngine可以完成大部分的VOIP相关人物,包括采集.自动增益.噪声消除.回声抑制.编解码.RTP传输.下边我们通过代码来解析Voe中处理流程: 创建VoiceEngine和 ...

  7. WebRTC源码分析:音频模块结构分析

    一.概要介绍WebRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输.上图中有三个Chann ...

  8. webrtc 音频一点相关知识

    采样频率:  44.1kHz ,它的意思是每秒取样44100次   .8kHz    8000次,  16kHz   160000次 比特率:  比特率是大家常听说的一个名词,数码录音一般使用16比特 ...

  9. webrtc自带client的音频引擎创建代码走读

    src\webrtc\examples\peerconnection\client\conductor.cc1.bool Conductor::InitializePeerConnection()1. ...

  10. WebRTC VoiceEngine综合应用示例(一)——基本结构分析(转)

    把自己这两天学习VoiceEngine的成果分享出来,供大家参考,有什么问题也欢迎大家指出,一起学习一起进步. 本文将对VoiceEngine的基本结构做一个分析,分析的方法是自底向上的:看一个音频编 ...

随机推荐

  1. jquery ajax的async属性的理解

    $(function(){ queryTemplateSort(); // fillAddTemplatePage(); function queryTemplateSort() { $.ajax({ ...

  2. Redis 网络通信及连接机制学习

    看了这篇文章 http://blog.nosqlfan.com/html/4153.html 本文所述内容基于 Redis2.6 及以上版本. 注:在客户端通过 info 命令可以查看服务器版本信息, ...

  3. 作业调度框架 Quartz.NET 2.0 StepByStep

    注:目前网上诸多介绍Quartz.net的文章,甚至Quartz.net官网上的Tutorial都是1.0版本的,而这个项目在2.0版本对项目进行了比较大规模的修改,使得原有的很多例子都不能运行,故写 ...

  4. android 自定义组件-带图片的textView

    1. 定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> <decla ...

  5. T-SQL备忘(3):分组合并

    --CREATE TABLE test(code varchar(50), [name] varchar(10),[count] int ) --INSERT test SELECT '001' , ...

  6. Oracle RAC OCR 与健忘症

    OCR就好比Windows的一个注册表,存储了所有与集群,RAC数据库相关的配置信息.而且是公用的配置,也就是说多个节点共享相同的配置信息.因此该配置应当存储于共享磁盘.本文主要基于Oracle 10 ...

  7. 最新 Arduino 驱动 12接口/户外 LED显示屏/LED点阵屏/LED单元板

    起因 现有的驱动LED显示屏的资料,比较好的只有这个.但是它驱动的是08接口的室内显示屏,而我要驱动的是12接口的户外显示屏.两种屏幕的区别在于户外屏幕点阵比较稀疏,而且二者的扫描方式,驱动方式都不太 ...

  8. 理解javascript的caller,callee,call,apply概念

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[ ...

  9. 1.解剖Linq to object

    LINQ想必大家都不陌生了,它的出现使得我们的代码变得更短.更优雅了.至于LINQ是什么,Linq to object这类的扩展方法到底做了些什么.我们使用的EF是如何实现的(如何解析Expressi ...

  10. 为网站添加网址图标favicon.ico

    今天终于有时间把domety的图标设计好,并显示在了网站地址前面.如果你还不知道怎么把自己的图标放到网站上,今天DDBug就和你分享一下实现方法. 制作图标 首先是准备一张ico图标,你可以从网上搜索 ...