先上编译大环境
再上编译小环境
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 git@github.com: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 git@github.com:freedesktop/pulseaudio-webrtc-audio-processing.git (这个是github上的会同步更新)
# 或者
# git clone git@gitlab.freedesktop.org:pulseaudio/webrtc-audio-processing.git (这个是官方平台)
- 进入源码目录,并创建build目录用于ninja编译
# cd pulseaudio-webrtc-audio-processing/
# mkdir build
# cd build
# meson ../ (命令成功之后会生成build.ninja,用于ninja的编译解析)
# ninja
【注意】
- 执行meson检测环境时旧版本会存在报错,master分支最新版本已解决,问题详见:https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing/-/issues/4
- 即便用了最新的代码,在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/