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

  • Post author:
  • Post category:linux




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


需要三个文件同时解压



版权声明:本文为lhy090271原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。