1. 程式人生 > 其它 >pulseaudio-webrtc-audio-processing的編譯環境搭建

pulseaudio-webrtc-audio-processing的編譯環境搭建

技術標籤:a&vwebrtcpulseaudiopythonmesonninja

先上編譯大環境

編譯大環境

再上編譯小環境

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/