Android開發小記:編譯ijkplayer以支持更多視頻格式

前言

ijkplayer大法好,感謝B站大佬。ijkplayer基於FFmpeg開發,適配Android/iOS平臺。FFmpeg在開發界簡直是神通常存在的項目,全平臺全格式音視頻編解碼支持。像前段時間「殺程序員祭天」的暴風,受衆頗廣的QQ影音都是FFmpeg的受益者,由於不遵循GNU LGPL協議,也是FFmpeg項目恥辱柱上的成員。java

可是ijkplayer默認是不支持播放av的,呵呵,臺詞錯了,是avi,今天分享下本身編譯ijkplayer以支持avi,mpeg/mpg等更多格式視頻。linux

前提條件

生產環境是MacOS或者Linux系統,筆者是MacOS,Android 6.0,這裏以Mac爲例記下本身編譯ijkplayer for Android的過程。build ijkplayer for Android.android

編譯準備

  1. 安裝homebrew:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. 安裝git:brew install git
  3. 安裝yasm:brew install yasm

下載ijkplayer項目:
git clone https://github.com/Bilibili/ijkplayer.gitgit

替換支持格式編譯腳本:程序員

cd ijkplayer/config
rm module.sh # 這是一個軟連接,默認指向module-lite.sh
ln -s module-default.sh module.sh複製代碼

設置編譯環境變量:
在終端執行如下命令(具體請指向本身的路徑github

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 ,實測經過編譯。shell

開始編譯

cd進入項目根目錄ruby

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複製代碼

執行過程當中出現的如下相似提示可忽略:bash

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編譯完了:curl

--------------------
[*] 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版本持續更新)

致謝

Bilibili/ijkplayer

相關文章
相關標籤/搜索