1. 程式人生 > >音訊模組基於最新Webrtc在Linux下的編譯

音訊模組基於最新Webrtc在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
需要三個檔案同時解壓