音频模块基于最新Webrtc在Linux下的编译

2019-07-13 07:03发布

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
需要三个文件同时解压