pulseaudio-webrtc-audio-processing的编译环境搭建

先上编译大环境

pulseaudio-webrtc-audio-processing的编译环境搭建_第1张图片

再上编译小环境

pulse-webrtc使用meson+ninja编译架构,所以首先需要搭建meson和ninja;
而meson又依赖python3的环境,准确说是python 3.6及以上版本,详情请见官网:https://mesonbuild.com/Getting-meson.html

python3

  • 添加python3的ppa源
# add-apt-repository ppa:deadsnakes/ppa
# apt update
# apt install python3.7   (目前最新版本支持到3.10)
  • 切换系统的python3软链接(更改优先级,优先使用3.7版本,数字越大优先级越高)
# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
  • 验证
# python3 --version
Python 3.7.9
  • 有需求的朋友可以自行切换pip的国内源,增加下载速度(未实测,我用的是默认源)
    之前没有安装过pip的话,可以通过命令:apt install python3-pip安装
# pip3 install pip -U -i https://pypi.tuna.tsinghua.edu.cn/simple
# pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

meson

  • 更新完了python3之后,配置meson环境可以使用如下简单的命令完成
# pip3 install meson

ninja

  • 下载源码后代码切换release分支:
# git clone [email protected]:ninja-build/ninja.git
# git checkout -b release remotes/origin/release
  • 编译,运行之后会在当前目录下生成ninja二进制文件
# ./configure.py --bootstrap
# cp ninja /usr/bin/

到这里已经完成所有必需的编译小环境,下面就可以准备对webrtc进行编译了。
但是在编译过程中遇到了一些依赖问题,这里也顺便把解决方法写一下:

abseil依赖库

这个是webrtc内的音频处理模块需要使用的库,需要将依赖库安装到编译环境里;该库源码使用的cmake编译框架,可以按照如下方式进行编译

# git clone https://github.com/abseil/abseil-cpp
# cd abseil-cpp/
# mkdir build
# cd build
# cmake .. -DCMAKE_INSTALL_PREFIX=/usr/ -DCMAKE_CXX_STANDARD=11 -DCMAKE_POSITION_INDEPENDENT_CODE=ON
# make && make install

这里要提一下cmake的编译选项:
INSTALL_PREFIX是程序的安装目录,放在/usr下便于后面编译webrtc时可以自动索引到;
CXX_STANDARD指定用c++ 11规范来进行编译,不然编译会出错;
POSITION_INDEPENDENT_CODE这个选项也很重要,类似于Makefile里面的-fPIC选项,用于指定静态库连接的方式,不加这一个选项的话在webrtc里面链接abseil库时会报错:error adding symbols: Bad value;

webrtc源码编译

  • 源码下载
# git clone [email protected]:freedesktop/pulseaudio-webrtc-audio-processing.git (这个是github上的会同步更新)
# 或者 
# git clone [email protected]:pulseaudio/webrtc-audio-processing.git (这个是官方平台)
  • 进入源码目录,并创建build目录用于ninja编译
# cd pulseaudio-webrtc-audio-processing/
# mkdir build
# cd build
# meson ../  (命令成功之后会生成build.ninja,用于ninja的编译解析)
# ninja

【注意】

  1. 执行meson检测环境时旧版本会存在报错,master分支最新版本已解决,问题详见:https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing/-/issues/4
  2. 即便用了最新的代码,在ninja编译的时候会报错,需要在源码中做如下修订才可以解决
diff --git a/webrtc/modules/audio_processing/echo_detector/mean_variance_estimator.cc b/webrtc/modules/audio_processing/echo_detector/mean_variance_estimator.cc
index a857403..10853f3 100644
--- a/webrtc/modules/audio_processing/echo_detector/mean_variance_estimator.cc
+++ b/webrtc/modules/audio_processing/echo_detector/mean_variance_estimator.cc
@@ -26,8 +26,8 @@ void MeanVarianceEstimator::Update(float value) {
   mean_ = (1.f - kAlpha) * mean_ + kAlpha * value;
   variance_ =
       (1.f - kAlpha) * variance_ + kAlpha * (value - mean_) * (value - mean_);
- RTC_DCHECK(isfinite(mean_));
- RTC_DCHECK(isfinite(variance_));
+ RTC_DCHECK(std::isfinite(mean_));
+ RTC_DCHECK(std::isfinite(variance_));
 }
 
 float MeanVarianceEstimator::std_deviation() const {
diff --git a/webrtc/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc b/webrtc/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc
index 8ec9fe9..dbed359 100644
--- a/webrtc/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc
+++ b/webrtc/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc
@@ -31,8 +31,8 @@ void NormalizedCovarianceEstimator::Update(float x,
   covariance_ =
       (1.f - kAlpha) * covariance_ + kAlpha * (x - x_mean) * (y - y_mean);
   normalized_cross_correlation_ = covariance_ / (x_sigma * y_sigma + .0001f);
- RTC_DCHECK(isfinite(covariance_));
- RTC_DCHECK(isfinite(normalized_cross_correlation_));
+ RTC_DCHECK(std::isfinite(covariance_));
+ RTC_DCHECK(std::isfinite(normalized_cross_correlation_));
 }
 
 void NormalizedCovarianceEstimator::Clear() {

最后再唠叨几句

  • webrtc使用的meson编译架构,在执行meson命令的时候他会解析meson.build文件,进行编译环境的配置。
    在这边meson命令其实可以等价成以前的configure命令,所以我们也可以在运行meson时添加一些参数选项:
# meson ../ --buildtype=debug or meson ../ --buildtype=release
# meson ../ --cross-file xxx.txt    (交叉编译)
  • webrtc示例代码(TODO:待补充)

最后关于meson的编译扩展,详见官网:https://mesonbuild.com/

你可能感兴趣的:(a&v,webrtc,pulseaudio,python,meson,ninja)