单独编译使用WebRTC的音频处理模块 - android
前言
最近一直在捣腾如何在android和iOS上使用Google的WebRTC——一个无疑大力推动了互联网即时通信以及VoIP发展的开源项目。
虽然WebRTC主要目标是为互联网提供高质量的富媒体即时通信,但其源码为C/C++所写,且其开发版中也包含对android 和 iOS 等移动设备的支持,因此对于如今飞速发展的移动互联网,WebRTC也能推波助澜大显神通。
WebRTC提供一套音频处理引擎VOE(本文不涉及视频处理引擎VIE),但VOE在 android 和 iOS 上的整体编译一直是一个比较繁琐且恼火的问题,于是单独提取了VOE中的NS(Noise Suppression 噪声抑制)、VAD(Voice Activity Detection 静音检测)、AECM(Acoustic Echo Canceller for Mobile 声学回声消除)以及 AGC(Auto Gain Control 自动增益控制)等模块进行编译并捣鼓其使用方法。
经过自己两月有余的捣腾和测试,终于在 android 和 iOS 上成功编译出各模块并在项目中使用了NS/VAD/AECM三大模块,效果比较不错。
回过头来看看,这几大模块的编译其实非常简单,不过两月前的自己也着实为这个花了一番力气。
正文
由于几大模块的编译方式相同,故本文仅以 NS 模块为例,其余模块请读者自行摸索和实验。
Step 1 - 下载 google WebRTC 源码
WebRTC目前的开发版主线版本已经到了 r4152 - 3.32,但这几大模块并未有大的修改,故本文依旧按bill当时的版本 3.31 进行讲解,请自行使用SVN同步以下目录(至于同步的方法,请自行google):
http://webrtc.googlecode.com/svn/branches/3.31/
Step 2 - 提取WebRTC - NS模块代码
同步源码后,进入目录 \webrtc\modules\audio_processing\ns ,将NS模块的源码拷贝出来,下面是单独编译NS时的参考源码列表(部分头文件在WebRTC项目其他目录下,请自行搜索提取):
defines.h
signal_procession_library.h
spl_inl.h
typdefs.h
windows_private.h
fft4g.h / fft4g.c
noise_suppression.h / noise_suppression/c
ns_core.h / ns_core.c
除了上述WebRTC源码外,如果要在android的Java代码中使用,还需自行编写JNI包装文件:
ns_jni_wrapper.c(此为自定义的 jni 包装文件,详情请见 此文)
ADDED(billhoo - 2013-6-14) 鉴于有朋友询问JNI Wrapper的编写,下面提供NS模块create以及initialize函数(这两个函数足以说明问题)的wrapper源码及注释,希望对大家有所帮助。更详细的编写步骤请参考 Oracle官方文档 或 此文 或 此文。
WebRtcNs_Create 包装函数及注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
/***
* Summary
* types:
* NSinst_t : the type of noise suppression instance structure.
* NsHandle : actually the same type of NSinst_t, defined in
* "noise_suppression.h" as a empty struct type named
* "NsHandleT".
*
* Note:
* 1.You have no need to pass env and jclazz to these functions,
* cus' JVM will does it for you.
* 2.We only support 10ms frames, that means you can only input 320
* Bytes a time.
**/
/**
* This function wraps the "WebRtcNs_Create" function in "noise_suppression.c".
* Input:
* none.
* Output:
* the handler of created noise suppression instance.
* Return value:
* -1 : error occurs.
* other value : available handler of created NS instance.
*
* @author billhoo
* @version 1.0 2013-1-29
*/
JNIEXPORT jint JNICALL
Java_你的类限定名_createNSInstance(JNIEnv *env,
jclass jclazz) {
NsHandle *hNS = NULL; //create a pointer to NsHandle on native stack.
if (WebRtcNs_Create(&hNS) == -1) { //allocate dynamic memory on native heap for NS instance pointed by hNS.
return -1; //error occurs
} else {
return (( int ) (NSinst_t *) hNS); //returns the address of NS instance on native heap.
}
}
|
WebRtcNs_Initiate 包装函数及注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/**
* This function wraps the "WebRtcNs_Init" function in
* "noise_suppression.c".
* Initializes a NS instance and has to be called before any other
* processing is made.
*
* Input:
* - nsHandler - Handler of NS instance that should be
* initialized.
* - sf - sampling frequency, only 8000, 16000, 32000
* are available.
* Output:
* nsHandler - the handler of initialized instance.
* Return value:
* 0 - OK
* -1 - Error
*
* @author billhoo
* @version 1.0 2013-1-29
*/
JNIEXPORT jint JNICALL
Java_你的类限定名_initiateNSInstance(JNIEnv *env,
jclass jclazz, jint nsHandler, jlong sf) {
NsHandle *hNS = (NsHandle*) nsHandler;
return WebRtcNs_Init(hNS, sf);
}
|
[END OF ADDED]
Step 3 - 编译WebRTC - NS模块
此步请参照 bill之前的文章将刚才提取的NS代码添加进eclipse工程进行编译即可。以下为NS模块的Android.mk文件:
1
2
3
4
5
6
7
8
9
|
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := webrtc_ns
LOCAL_SRC_FILES := \
noise_suppression.c \
ns_core.c \
fft4g.c \
ns_jni_wrapper.c
include $(BUILD_SHARED_LIBRARY)
|
编译完成后,将项目中的 webrtc_ns.so 动态库拷贝出来以备后续使用。
Step 4 - 加载编译好的NS模块动态库
接下来只需要按照 此文 的描述在 android 的JAVA代码中使用刚才编译好的 webrtc_ns.so 动态库便大功告成。
Step 5 - 几大模块的使用及注意事项
前四步已经完成了几大音频处理模块在android上的单独编译过程,并分别生成了 webrtc_ns.so、webrtc_vad.so、webrtc_aecm.so 以及 webrtc_agc.so 四个动态库,下面bill简要介绍对NS、VAD以及AECM三个库的函数使用方法及注意事项:
5.1 - NS库函数的使用及注意事项
这个很简单,参照 noise_suppression.h 头文件中对各API的描述即可,首先使用 WebRtcNs_Create 创建NS实体,然后 WebRtcNs_Init 初始化该实体,WebRtcNs_set_policy 设置噪声抑制的级别(bill使用的是最高级别 2,效果比较理想),设置完成后便可调用 WebRtcNs_Process 循环对10ms(8000Hz、16000Hz)音频帧进行NS处理,注意最后别忘了调用 WebRtcNs_Free 将NS实体销毁。
5.2 - VAD库函数的使用及注意事项
VAD的使用和NS区别不大,唯一需要注意的是VAD仅仅只是检测,返回结果1表示VAD检测此帧为活动帧,0表示此帧为静音帧,至于判断为静音后该进行何种处理,就和你自己的项目相关了。
5.3 - AECM库函数的使用及注意事项
AECM实体的创建、初始化和销毁工作与上述相同,之后需要在远端和近端分别调用 WebRtcAecm_BufferFarend以及 WebRtcAecm_Process,对于AECM的使用,需要注意的重点在于Process函数的参数msInSndCardBuf,该参数在audio_procession.h头文件中以名为delay的变量呈现,该延迟的计算确为一难点(对于单独使用AECM模块来说),不过只要严格按照delay的描述进行操作即可。
附:
其他几大模块单独编译时需要的源文件列表(所有依赖头文件略,请自行根据报错添加):
WebRTC - VAD 模块源文件列表
注意:VAD的编译需要宏 WEBRTC_POSIX 的支持,而该宏是否有实现,由 WEBRTC_ANDROID 等宏是否被定义决定,若你在编译时提示 once 函数未定义等错误, 请自行添加对 WEBRTC_ANDROID宏的定义。
webrtc_vad.c
vad_core.c
vad_filterbank.c
vad_gmm.c
vad_sp.c
real_fft.c
division_operations.c
complex_bit_reverse.c
cross_correlation.c
complex_fft.c
downsample_fast.c
vector_scaling_operations.c
get_scaling_square.c
energy.c
min_max_operations.c
spl_init.c
WebRTC - AECM 模块源文件列表
randomization_functions.c
spl_sqrt_floor.c
division_operations.c
min_max_operations.c
ring_buffer.c
delay_estimator.c
delay_estimator_wrapper.c
complex_bit_reverse.c
complex_fft.c
aecm_core.c
echo_control_mobile.c
WebRTC - AGC 模块源文件列表
spl_sqrt.c
copy_set_operations.c
division_operations.c
dot_product_with_scale.c
resample_by_2.c
analog_agc.c
digital_agc.c
单独编译使用WebRTC的音频处理模块 - android相关推荐
- 单独编译使用WebRTC的音频处理模块
不推荐单独编译 WebRTC 中的各个模块出来使用. 昨天有幸在 Google 论坛里询问到 AECM 模块的延迟计算一事,Project member 说捣腾这个延迟实际上对 AECM 的效果没有帮 ...
- java webrtc ns降噪_单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)...
webrtc的音频处理模块分为降噪ns,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到回声消除 ...
- 单独编译和使用webrtc音频降噪模块(NS)
原文转载于:http://www.cnblogs.com/mod109/p/5469799.html 非常感谢. webrtc的音频处理模块分为降噪ns,回音消除aec(回声控制acem),自动控 ...
- 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)
单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件) webrtc的音频处理模块分为降噪ns,回音消除aec,回声 ...
- WebRTC 的音频处理流水线
基于 RTC 场景下要解决的声音的问题,WebRTC 有一个大体如下图所示的音频处理流水线: WebRTC 的音频处理流水线,不是一次性建立起来的,而是分阶段分步骤建立的.整体而言,可以认为这个流水线 ...
- WebRTC 音频模块单独编译 --【转载】
原文地址:http://billhoo.blog.51cto.com/2337751/1213801 [2015年2月15日] Bill 这段时间没有再关注 WebRTC 以及音频处理的相关信息,且我 ...
- 【WebRTC】在Android上用NDK编译WebRtc音频增益模块(AGC),降噪(NS),java调用JNI实现功能
目录 ·········前言 ·········前期工作 ·········编译工作 ·········编码工作(AGC-JAVA) ·········编码工作(AGC-JNI) ·········编 ...
- Android AOSP 单独编译某一模块
由于AOSP 项目太大,我只修改了一个模块,比如设置. 那么只需要单独编译设置这个模块就可以了. 首先执行Source: source build/envsetup.sh 执行之后,就会有一些额外的命 ...
- 单独编译apache的rewrite模块
单独编译apache的rewrite模块 装好了一个基于Modx的网站 在IE里面访问时,出来的页面是apache内部错误,请联系管理员 查看apache的错误日志里面内容如下 [Tue Nov 25 ...
最新文章
- 【C++】浅析析构函数(基类中)为什么要写成虚基类?
- string类具体用法
- DSP的EMIF接口通信FPGA
- Optimized Purchasing基础知识
- Java float类型怎么把小数位数限制为2位
- 分享10个2012年最新发布的jQuery插件
- 玩转 VS Code 专栏
- 题库明细 C#语言和SQL Server
- Spring Security Oauth2 (二) 代码 授权码模式
- Notepad++在编程使用时的小技巧
- twisted python_Python爬虫Scrapy框架之Hello Word
- java2实用教程第四版实验指导_Java2实用教程(第4版)实验指导与习题解答_IT168文库(精)...
- POJ 3311 Hie with the Pie(状压DP + Floyd)
- 杰理AD15 玩具类编解码音频芯片
- matlab对矩阵模板卷积,矩阵卷积Matlab(转载)
- HTML学生个人网站作业设计:动漫网站设计——哆啦A梦(5页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
- airtest web 录制滑块_AirTest学习四,录制Web测试脚本
- 伯克利大学计算机作业答案,W 同学_加州大学伯克利分校_计算机_录取成功案例分享...
- 利用JavaScript批量删除QQ空间说说(只需一个浏览器)
- Could not find artifact xxx.xxx:ww-www-ww:pom:1.0.1-SNAPSHOT in xxxx(http://xxx.xxx.xxx:xxxx私服地址)
热门文章
- Android页面跳转、延时跳转、跳转传值
- android nsdservice 类型,Android NSD onServiceFound()没有被调用
- 为什么matlab用不成了,matlab2008 安装了不能用为什么?
- 闽南师范大学计算机学院研究生,闽南师范大学计算机学院2019考研调剂信息
- python二维数组初始化_如何在Python中初始化二维数组?
- VB 小技巧自定义TextBox文本框右键菜单
- 下个目标是攻克FIFA游戏?DeepMind让AI自学传球配合
- 李飞飞之后谷歌再失华裔高管,谷歌AI中国中心总裁李佳离职创业
- 赠票福利 | 2018人工智能计算大会报名开启:算力爆燃,AI进化
- 对话张潼 | 腾讯AI Lab周岁:规模飙至370人,要做后来居上的终结者