webrtc中APM(AudioProcessing module)的使用
一,实例化和配置
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)的使用的更多相关文章
- webrtc中APM(AudioProcessing module)的使用2
这个其实就是从Audio_processing.h中拿出来的. APM should be placed in the signal chain as close to the audio hardw ...
- android studio 中移除module和恢复module
一.移除Android Studio中module 在Android Studio中想要删除某个module时,在Android Studio中选中module,右键发现没有delete,如图: An ...
- Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析
本文主要介绍WebRTC中丢包重传NACK的实现,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...
- Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析
本文主要介绍WebRTC中的RTP/RTCP协议,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...
- webrtc中的带宽自适应算法
转自:http://www.xuebuyuan.com/1248366.html webrtc中的带宽自适应算法分为两种: 1, 发端带宽控制, 原理是由rtcp中的丢包统计来动态的增加或减少带宽,在 ...
- Node.js中exports,module.exports以及require方法
在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是, ...
- WebRTC中的NetEQ
NetEQ使得WebRTC语音引擎能够快速且高解析度地适应不断变化的网络环境,确保了音质优美且缓冲延迟最小,其集成了自适应抖动控制以及丢包隐藏算法. WebRTC和NetEQ概述 WebRTC Web ...
- [转载]Pytorch中nn.Linear module的理解
[转载]Pytorch中nn.Linear module的理解 本文转载并援引全文纯粹是为了构建和分类自己的知识,方便自己未来的查找,没啥其他意思. 这个模块要实现的公式是:y=xAT+*b 来源:h ...
- ULPFEC在WebRTC中的实现[转载]
一.WebRTC对抗网络丢包的两种手段 丢包重传(NACK)和前向纠错(FEC).FEC是一种前向纠错技术,发送端将负载数据加上一定的冗余纠错码一起发送,接收端根据接收到的纠错码对数据进行差错 ...
随机推荐
- PostgreSQL数据库中的常见错误
转载以作参考. 错误1 FATAL: connection limit exceeded for non-superusers 原因:非超级用户的连接数(max_connections - super ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- spring拦截器排除 静态资源
拦截器需要排除静态资源,不然会造成资源浪费 <!-- 拦截器 --> <mvc:interceptors> <!-- 使用bean定义一个Interceptor,直接定义 ...
- solr基本入门
一直想接触下搜索,虽然之前也玩了下solr,但一直没深入,所以也都忘得差不多了,现在solr都6.1了,发展真快.重新拾起,记录下也好,为以后出问题查找起来快一点. 1.搜索最重要的概念就是倒排索引, ...
- (总结)隐藏PHP版本与PHP基本安全设置
为了安全起见,最好还是将PHP版本隐藏,以避免一些因PHP版本漏洞而引起的攻击. 1.隐藏PHP版本就是隐藏 “X-Powered-By: PHP/5.2.13″ 这个信息. 方法很简单:编辑php. ...
- vim 添加php自动补全 并格式化代码
自动补全,修改/etc/vimrc的配置 vim /etc/vimrc 添加: filetype plugin on autocmd FileType php set omnifunc=phpcomp ...
- MySQL 应用优化
一.使用连接池 二.减少对MySQL的访问 (A) 避免对同一数据做重复检索. (B) 使用查询缓存,MySQL的查询缓存会存储SELECT查询的命令文本和相应的结果. (C) 增加CACHE层 三. ...
- matlab -xlsread 打开xls文件出错:服务器出现意外情况
错误:xlsread:服务器出现意外情况 原因:非matlab问题,Excel的com加载项启用 解决方法:office - Excel选项-加载项:管理-com加载项-转到-取消可用加载项的勾选.
- [iOS] 为文本加上横线方法
_oldPriceLabel.text = "; _oldPriceLabel.textColor = [UIColor lightGrayColor]; NSMutableAttribut ...
- POJ 2533 Longest Ordered Subsequence LCS O(n*log(n))
题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #define SIZE 1001 using namespace ...