WebRTC音频预处理单元APM的整体编译及使用
正文
行的gnu静态库链接路径是针对NDK版本 r8d 的,如读者版本不匹配,请自行找到 libgnustl_static.a 静态库的路径进行替换。
3)本示例并不打算编译 WebRTC 的测试工程,请使用 Eclipse 搜索文件功能,找到 Android.mk 文件中的 -DWEBRTC_AUDIOPROC_DEBUG_DUMP 并注释掉。
step 3.4
万事俱备,我们可以开始编译 APM 了,不过在编译过程中肯定还会有很多小问题出现(比如相对路径不正确、找不到某某函数的符号等等),这些问题就留给读者自行google、SO解决了,bill就不再赘述。
Step 4 - 在android应用中使用APM的注意事项
经过上述步骤,读者便能够得到 libwebrtc_audio_preprocessing.so这个动态链接库。我们需要做的仅仅是编写自己的 jni 包装函数向 android 应用层提供 APM 的接口。具体做法bill之前的文章已经详细介绍过。这里需要注意的是,如果读者打算在自己的动态库中引用已经编译好的 APM 库,那么在 android 类加载这两个库时的顺序是敏感的。
假设读者将自己的 JNI 接口封装成单独的库 libmy_jni_wrapper.so,而该库引用了 libwebrtc_audio_preprocessing.so,那么在加载这两个库时应该参照如下顺序:
1
2
3
4
5
|
static { // Ordering of loading these shared libraries is significant. System.loadLibrary( "webrtc_audio_preprocessing" ); System.loadLibrary( "my_jni_wrapper" ); } |
若顺序写反,在运行时将得到找不到 webrtc_audio_preprocessing 库中符号的异常。
总结
整个编译工作在现在看来非常简单,但需要很多的耐心和搜索,不过结果还是令人比较满意的,APM出来的效果比之前自己单独使用各个音频模块要好很多。不过对于抖动等因素的影响,APM就力不从心了。也许bill接下来该花时间去看看NetEq、Jitter Buffer等模块了。如何使用他们,如何融进自己的项目,到时候就知道了。
参看了您的博文之后,关于回音处理部分我的项目也基本完成了,正像您所说的,在网络比较差的时候,由于延时与抖动,和丢包所引起的质量下降。而我的下一步也是想把NetEQ使用自己的项目中。如果您有什么进展的话,期望能和您一起讨论讨论。
bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux
d.exe: E:/cygwin/home/simon/WebRTC/obj/local/armeabi/libwebrtc
dio_device_opensles_android.o): in function webrtc::AudioDevic
MicrophoneIsAvailable(bool&):E:/cygwin/home/simon/WebRTC/jni/w
o_device/android/audio_device_opensles_android.cc:167: error:
e to 'webrtc::OpenSlesInput::MicrophoneIsAvailable(bool&)'
您好it206,
最近没有倒腾android上的回声消除了,效果和之前是一样的,好的时候很好,差的时候总能听到唧唧声,很不爽。现在效果很不完美。关于apk,那是团队的成果了,我没有权力拿出来分享,博客里我已经把自己能分享的都分享给大家了,忘海涵。
您好,APM各个接口的使用方法在其头文件 audio_processing.h 中描述的很清楚。android上由于没有控制MIC音量的接口,故APM中的AGC不要使用 kAdaptiveAnalog 模式。
,我查找了,在webrtc/system_wrappers/source/Android.mk 文件中添加了$(call import-module,android/cpufeatures)
,可以编译通过这个错误了,这是正确解决方法?另外编译system_wrappers/source/Android.mk,又遇到提示一个错误:system_wrappers/source/spreadsortlib/spreadsort.hpp:1034:139: error: macro "getchar" passed 2 arguments, but takes just 0;这个真心不知道什么错误,很想问,Bill_Hoo,你在编译过程,又遇到这些错误?这我应该如何解决呢,有点困惑。
你好,IOS 上仅使用了 NS降噪 和 NetEQ 抖动缓冲,回声消除交由其自身的 API 实现更加合适。
https://github.com/billhoo/webrtc-based-android-aecm
但是现在已经无法下载了 可否给我一份作为研究 不胜感激 71892967@qq.com
它不是用AudioRecord.read这种阻塞式函数读取录到的数据,
而是和ios中AudioQueue类似的填满一个缓冲区即回调的方式,我想这样是不是更容易计算延迟一些呢?
[armeabi] Compile arm : webrtc_spl <= auto_corr_to_refl_coef.c
jni/webrtc/common_audio/signal_processing/auto_corr_to_refl_coef.c:17:85: fatal error: webrtc/common_audio/signal_processing/include/signal_processing_library.h: No such file or directory
您好,根据你的错误路径提示,编译 auto_corr_to_refl_coef.c 的 Android.mk 至少应该包含路径:
“$(LOCAL_PATH)/../../../..”,即目录“jni”。
也就是说,你需要让编译器能够找到根目录 “webrtc”
您好,GitHub上的示例我已经删除了,那是当时自己最开始自以为是的认为手机上的回声消除很简单,所以有了一个直接使用AECM对静态音频文件进行消除的例子。但实际上VoIP和静态文件是两码事。为避免误导他人,故已删除。
就个人经验而言,Java层的 AudioTrack 以及 AudioRecord 实在不适合(未考虑最新版本的Android)做所谓的“延迟估算”。OpenSLES 我没有实际测试过,不敢妄言。
回复 liuliu886:
[14楼]
你好,IOS 上仅使用了 NS降噪 和 NetEQ 抖动缓冲,回声消除交由其自身的 API 实现更加合适。
你好,bill。请问IOS具体哪个API可以用来消除回声呢?
http://wiki.elesos.com/index.php?title=WebRTC%E7%B3%BB%E5%88%974:%E9%9F%B3%E9%A2%91%E5%A4%84%E7%90%86%E6%A8%A1%E5%9D%97apm%E4%B8%8B%E8%BD%BD%E4%B8%8E%E6%95%B4%E4%BD%93%E7%BC%96%E8%AF%91
WebRTC音频预处理单元APM的整体编译及使用的更多相关文章
- 【WebRTC音频预处理单元APM的整体编译及使用 - android】
前言 在写[单独编译使用WebRTC的音频处理模块 - android]一文之前,就一直想直接把WebRTC的音频处理引擎VoE整个儿编译出来供自己的项目使用,但限于技术拙劣.时间紧迫,所以没能成功. ...
- 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)
单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件) webrtc的音频处理模块分为降噪ns,回音消除aec,回声 ...
- 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件)
webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到 ...
- 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)
单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 说实话很不想写这篇文章,因为这和我一贯推崇的最好全部编译并使用w ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- WebRTC音视频引擎研究(1)--整体架构分析
WebRTC技术交流群:234795279 原文地址:http://blog.csdn.net/temotemo/article/details/7530504 1.WebRTC目的 ...
- 转: WebRTC音视频引擎研究(1)--整体架构分析
转自: http://blog.csdn.net/temotemo/article/details/7530504 目录(?)[+] WebRTC技术交流群:234795279 原文地址:ht ...
- 音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)
前言: 前面我用了很多章实现了javaCV的基本操作,包括:音视频捕捉(摄像头视频捕捉和话筒音频捕捉),推流(本地音视频或者摄像头话筒混合推流到服务器),转流(rtsp->rtmp),收流(录制 ...
- WebRTC音频通话升级为视频通话
我们有时候在音频通话过程中,想要改成视频通话.如果挂断当前通话再重新发起视频通话就会显得比较麻烦. 因此很多app提供了将音频通话升级成视频通话的功能,同时也有将视频通话降为音频通话的功能. 本文演示 ...
随机推荐
- thinkphp疑难解决4
关于文件上传所涉及到的php.ini 中的一些配置: (以当前要设置的关键字开头...) 是每个上传文件所允许的大小, 默认的 upload_max_filesize = 2M, 如果超过了2M,_P ...
- shell if 浮点数比较
转shell中的浮点数比较http://nigelzeng.iteye.com/blog/1604640 博客分类: Bash Shell shell比较浮点数 由于程序需要,我要判断一个浮点数是否 ...
- HTML和XHTML的区别
引言:XHTML是用XML语言重写了HTML,也可以理解为XHTML是HTML的过渡语言,它比HTML语言更严谨,基本语言都还是沿用HTML的标签. XHTML和HTML的差别主要分为两大类: 功能上 ...
- Redis 缓存过期(maxmemory) 配置/算法 详解
LRU(Least Recently Used) 最近最少使用算法是众多置换算法中的一种. Redis中有一个 maxmemory 概念,主要是为了将使用的内存限定在一个固定的大小.Redis 用到的 ...
- python note
=和C一样,为赋值.==为判断,等于.但是,在python中是不支持行内赋值的,所以,这样避免了在判断的时候少写一个出错. dictionary 的key唯一,值可以为很多类型. list的exten ...
- mysql 性能优化方向
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- -bash: fork: retry: Resource temporarily unavailable
登陆不了服务器The server refused to start a shell. 登陆服务器后执行ls命令报错: 1 2 $ls -bash: fork: retry: Resource t ...
- spark 快速入门 java API
Spark的核心就是RDD,对SPARK的使用入门也就是对RDD的使用,包括action和transformation 对于Java的开发者,单单看文档根本是没有办法理解每个API的作用的,所以每个S ...
- ASCII码、Unicode码 转中文
ASCII码.Unicode码 转中文 在最近工作中遇到了一些汉字编码转换的处理,可以通过正则表达式及转换字符来实现转成中文 Unicode转换示例 通常为10位编码, 通过digit参数传入 pri ...
- MySQL重置root密码
1,以管理员身份进入cmd命令行,输入命令:Net stop mysql; 2 ,进入mysql安装目录的bin文件夹下,执行mysqld --skip-grant-tables 启动MySQL S ...