前言
ijkplayer大法好,感謝B站大佬。ijkplayer基於FFmpeg開發,適配Android/iOS平臺。FFmpeg在開發界簡直是神一般存在的專案,全平臺全格式音視訊編解碼支援。像前段時間“殺程式設計師祭天”的暴風,受眾頗廣的QQ影音都是FFmpeg的受益者,因為不遵循GNU LGPL協議,也是FFmpeg專案恥辱柱上的成員。
但是ijkplayer預設是不支援播放av的,呵呵,臺詞錯了,是avi,今天分享下自己編譯ijkplayer以支援avi,mpeg/mpg等更多格式視訊。
前提條件
生產環境是MacOS或者Linux系統,筆者是MacOS,Android 6.0,這裡以Mac為例記下自己編譯ijkplayer for Android的過程。build ijkplayer for Android.
編譯準備
- 安裝homebrew:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 安裝git:
brew install git
- 安裝yasm:
brew install yasm
下載ijkplayer專案:git clone https://github.com/Bilibili/ijkplayer.git
替換支援格式編譯指令碼:
cd ijkplayer/config
rm module.sh # 這是一個軟連結,預設指向module-lite.sh
ln -s module-default.sh module.sh複製程式碼
設定編譯環境變數:
在終端執行以下命令(具體請指向自己的路徑)
export ANDROID_NDK=/Users/michaelx/Library/Android/sdk/ndk-bundle
export ANDROID_SDK=/Users/michaelx/Library/Android/sdk複製程式碼
官方建議NDK版本為r10e,筆者為r13.1,MacOS 10.12.6 ,實測通過編譯。
開始編譯
cd進入專案根目錄
bash init-android.sh
cd android/contrib
# 執行以下兩條命令
./compile-ffmpeg.sh clean
# 如果預設shell不是bash,建議執行以下命令
bash compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
# 如果預設shell不是bash,建議執行以下命令
bash compile-ffmpeg.sh all複製程式碼
執行過程中出現的以下類似提示可忽略:
WARNING: aarch64-linux-android-pkg-config not found, library detection may fail.
--------------------
[*] compile ffmpeg
--------------------
libavfilter/avfiltergraph.c: In function 'avfilter_graph_free':
libavfilter/avfiltergraph.c:132:5: warning: 'resample_lavr_opts' is deprecated (declared at libavfilter/avfilter.h:847) [-Wdeprecated-declarations]
av_freep(&(*graph)->resample_lavr_opts);
^複製程式碼
出現以下提示時FFmpeg編譯完了:
--------------------
[*] Finished
--------------------
# to continue to build ijkplayer, run script below,
sh compile-ijk.sh複製程式碼
那我們就可以編譯ijkplayer拿到so動態庫檔案。按照提示執行:
bash compile-ijk.sh
# or
sh compile-ijk.sh複製程式碼
出現以下提示表示ijkplayer編譯完畢:
[armeabi-v7a] Compile++ thumb: ijksoundtouch <= BPMDetect.cpp
[armeabi-v7a] Compile++ thumb: ijksoundtouch <= PeakFinder.cpp
[armeabi-v7a] Compile++ thumb: ijksoundtouch <= SoundTouch.cpp
[armeabi-v7a] Compile++ thumb: ijksoundtouch <= mmx_optimized.cpp
[armeabi-v7a] Compile++ thumb: ijksoundtouch <= ijksoundtouch_wrap.cpp
[armeabi-v7a] Install : libijkffmpeg.so => libs/armeabi-v7a/libijkffmpeg.so
[armeabi-v7a] StaticLibrary : libcpufeatures.a
[armeabi-v7a] StaticLibrary : libijkj4a.a
[armeabi-v7a] StaticLibrary : libandroid-ndk-profiler.a
[armeabi-v7a] StaticLibrary : libijksoundtouch.a
[armeabi-v7a] StaticLibrary : libyuv_static.a
[armeabi-v7a] SharedLibrary : libijksdl.so
[armeabi-v7a] SharedLibrary : libijkplayer.so
[armeabi-v7a] Install : libijksdl.so => libs/armeabi-v7a/libijksdl.so
[armeabi-v7a] Install : libijkplayer.so => libs/armeabi-v7a/libijkplayer.so
/Users/michealx/Documents/ijkplayer/android複製程式碼
進入ijkplayer/android/ijkplayer/armeabi-v7a/
就可以拿到編出來的ijkplayer so了,那麼編出來的ijkplayer so怎麼用到專案當中呢?接著看。
使用編譯出來的ijkplayer so庫
ijkplayer的預設用法如下:
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.3'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.3'複製程式碼
第二個依賴沒有任何程式碼,實際只是so庫,既然要使用自己編譯出來的so,那麼第二個依賴可以去掉:
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.3'
// compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.3'複製程式碼
將自己編譯出來的3個so檔案放入專案的main/jniLibs/armeabi-v7a/
下即可。播放程式碼無需做任何改變,現在ijkplayer就可以播放avi,mpeg/mpg多更多格式視訊了。
至於ijkplayer更多玩法,筆者也還在探索,如果後續有空筆者會陸續更新。
傳送門
基於ijkplayer 0.8.3編譯的Android so庫(比預設依賴支援更多格式):
github:compiled_ijkplayer4android(後續會根據ijkplayer版本持續更新)