公司的一個項目新項目涉及到音頻播放的內容,音頻格式從常見的 mp3 到冷門的無損音樂 ape 都有,琢磨了很久,最後選中了 B 站的開源庫 ijkplayer ,但是 ijkplayer 提供的默認 so 庫並不支持無損音樂,而我在網上找了許久也沒有找到其餘人編譯的現成擴展庫,就只能本身來動手了,折騰了許久總算是搞定了,此處我就寫下本身的實現步驟以幫助後人,文章末尾也提供了已編譯好的 so 庫,須要的讀者請自取linux
開發環境:Linux (Deepin) NDK 版本:android-ndk-r14b ijkplayer 版本:k0.8.8android
這裏我選擇使用的 NDK 版本是 android-ndk-r14b-linux-x86_64
,將它先移動到 usr 文件夾下新建的 android 文件夾內git
解壓 ndk 壓縮包到 android 目錄下github
我這裏是選擇安裝 Android Studio
來使用其附帶的 Android SDK
,理論上單獨只安裝 Android SDK
應該也是能夠的。我使用的 Android Studio
版本是 android-studio-ide-191.5791312-linuxshell
將壓縮包移動到 usr/android
文件夾內,並解壓android-studio
啓動 Android Studio ,以後就是常規的一些配置了,將 SDK 安裝在當前新建的 android-sdk
目錄下bash
安裝 Git 用於下載及更新 ijkplayer
以及其依賴庫架構
sudo apt-get update //或許須要
sudo apt-get install git
複製代碼
下載 ijkplayer 源碼,並切換到當前最新的 k0.8.8 分支下ide
git clone https://github.com/Bilibili/ijkplayer.git
git checkout -B latest k0.8.8
複製代碼
ijkplayer 的 config 文件夾內的 module-default.sh 文件配置了編譯默認支持的音頻格式,enable 表明啓用,disable 表明禁用,根據項目須要修改 module-default.sh 文件後,將之做爲當前的配置腳本學習
sudo rm module.sh
ln -s module-default.sh module.sh
source module.sh
複製代碼
在 ijkplayer 源代碼目錄下運行如下命令進行初始化以便下載一些依賴庫,網速緣由可能須要好久
sudo ./init-android.sh
複製代碼
ijkplayer 默認不支持 https 連接,須要運行如下命令使其支持
./init-android-openssl.sh
複製代碼
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
複製代碼
若是在運行了以上命令後控制檯提示報了以下提示,那麼這是由於 compile-ffmpeg.sh 不知道當前系統安裝的 NDK 路徑致使的
ANDROID_NDK=
You must define ANDROID_NDK before starting.
They must point to your NDK directories.
複製代碼
能夠經過在 ijkplayer/android/contrib/tools/do-compile-ffmpeg.sh
文件的開頭定義 NDK 路徑來解決
ANDROID_NDK=/usr/android/android-ndk-r14b
複製代碼
以後,從新運行命令便可
cd ..
./compile-ijk.sh all
複製代碼
報錯的話同樣須要在 compile-ijk.sh
文件頭部定義 Android SDK 和 NDK 的路徑
若是編譯成功,則會在 android 文件夾內生成一個 ijkplayer 工程,當中包含了各個架構的 so 庫,到此那就大功告成了
將各個 CPU 架構下對應的 so 庫拷貝到本身的項目中,至此就得到了所須要的擴展 so 庫
編譯好的 so 庫我已經上傳到 GitHub 了,項目主頁:ijkplayer-so-extend
經測試,能夠正常播放 wav 、ape 等格式的音頻
本文已收錄至個人學習筆記合輯:JavaKotlinAndroidGuide