Webrtc中音频模块的单独编译
版权声明:本文为博主原创文章,若需转载请注明出处。
在我们的嵌入式项目中,想要使用webrtc的音频处理逻辑及相关网络功能。由于整个webrtc工程过于巨大,所以尝试单独编译某个模块以供调用。
见上一篇博客,经过编译的音频模块效果显著,可是在移植到我们移动平台端的时候,CPU占用过高,所以尝试编译最新webrtc看是否在最新代码上该问题有所改善。
1. 准备
webrtc源码路径:
https://webrtc.googlesource.com/src
(国外环境,请自备工具)
使用windows的git客户端下载源码
git clone https://webrtc.googlesource.com/src
2. 编译
2.1 编译所需文件路径
./common_audio/Makefile
./common_audio/signal_processing/Makefile
./common_audio/third_party/spl_sqrt_floor/Makefile
./modules/audio_processing/aec/Makefile
./modules/audio_processing/aecm/Makefile
./modules/audio_processing/ns/Makefile
./modules/audio_processing/utility/Makefile
./rtc_base/Makefile
./system_wrappers/source/Makefile
由于代码改动,所以引用的源文件与上一篇博客所述有所差异,所以以上目录中所需文件可以在生成最后测试可执行文件时分辨:假如链接不到某个函数入口,也即编译时需要依赖该函数对应的源文件参与编译。
注:Makefile文件需自己编写 ,并且编译过程朱需要依赖相当的C++11特性
2.2 编译时候可能遇到的坑
1)由于使用的是Ubuntu 16作为测试时的编译环境 ,所以后缀为win.c/cc、 android.c/cc 、mac.c/cc (对应windows,安卓,苹果)的文件不需要参与编译
2)由于不使用汇编,所以对应的mpis.c/cc/S 、neon.c/cc/S 对应文件不参与编译
3)
编译时报错找不到头文件定义
:
absl/types/optional.h: No such file or directory
刚遇到这个问题时候以为是路径没写对,但是经过查找整个工程文件中都没有包含这个目录/文件,以为是下载包不完整造成的,但是较新的版本都没有这个目录或者文件。再尝试找度娘,显而易见的,度娘并不能在这方面提供帮助,
或许在找医院时候很厉害(笑)
,最后翻墙去找谷歌。
果然有大佬遇到过类似问题:
https://github.com/mpromonet/webrtc-streamer/issues/126
解决方案:
这就明白了,第三方的鬼东西,行吧。
然后下载了 abseil-cpp 这个第三方C++11辅助库,这个东西需要Cmake编译。
cmake下载地址 :
https://cmake.org/download/
cmake 默认安装:
./bootstrap && make && make install
abseil 下载地址:
https://github.com/abseil/abseil-cpp/tree/master/absl
abseil 默认安装:
cmake -L CMakeLists.txt && make
安装abseil后把相应的静态库还有头文件提取出来,可参见
for i in `find -name *.h`;\
do path=$(dirname $i);\
mkdir -p absl-bak/$path;\
cp $i absl-bak/$path;\
done
链接时依赖类似命令:
-L$(ABSL)/lib -labsl_strings -I$(ABSL)/include
-L$(ABSL)/lib -labsl_optional -I$(ABSL)/include
3. 测试
参照上一篇博客,测试nsx整形数据降噪算法,但是发现接口与之前有所不一致:
之前接口:
int WebRtcNsx_Process(NsxHandle* nsxInst,
short* speechFrame,
short* speechFrameHB,
short* outFrame,
short* outFrameHB);
最新接口:
void WebRtcNsx_Process(NsxHandle* nsxInst,
const short* const* speechFrame,
int num_bands,
short* const* outFrame);
可以看到,最新接口参数数目,以及参数类型不一致。
1) 首先以为是把原来低位数据从一级指针变成取其二级指针也就是从frame到&frame,但是结果显然不是。
2)然后查看接口内部实现
行吧,把原来低频数据和高频数据放到一个变量里面去,也就是从:
( ? ,dataL ,dataH ,? ) ——-> ( ? , (data[0] = dataL ,data[1] = dataH) , ? )
这种形式。
但请注意变量类型“const short* const*”这里的const修饰,该关键字表示用户变量不可修改,那么我们必须要在变量定义时候同时给其赋值。
再稍微解释一下WebRtcNsx_Process接口,其与之前参数多了一个band_num,当用户音频频率超过>16K时,band_num需要设置为大于1的值,并且使用相应的把音频分为高低频的接口,当频率低于等于<=16K时直接使用接口并设置为1即可。
下载:
https://download.csdn.net/download/lhy090271/10782137
https://download.csdn.net/download/lhy090271/10782153
https://download.csdn.net/download/lhy090271/10782169
需要三个文件同时解压