ijkplayer之.so文件編譯過程


本文轉載:ijkplayer編譯so庫真沒那么難

 

 

1.如何使用ijkplayer

 

官方https://github.com/Bilibili/ijkplayer

build.gradle添加下述依賴引用即可:

dependencies {     # 對於大部分的設備來說已經夠用了     compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'      # Other ABIs: 可選     compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.4'     compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.4'      # ExoPlayer as IMediaPlayer: optional, experimental     compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.4' }
 
 
 
         
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這里簡單說點東西來解除你可能存在的一些疑惑:

armv7aarmv5arm64x86x86_64 這些是對應的CPU架構, 
一般來說准備一個armv7a就基本夠了,如果系統找不到CPU架構 
對應的so庫會去找armeabi,多依賴一些架構只是稍微會快一點, 
但是這樣也伴隨着apk體積的增大,這個需要你自行去權衡!!! 
反正筆者就只有一個:armv7a,暫時沒發現什么不服!

然后使用方法和MediaPlayer大同小異,這就不另外講述怎么 
使用了,網上一搜也很多。接下來要說下筆者遇到的一個問題:

ijkplayer默認不支持HTTPS

是的,不支持,如果你嘗試使用ijkplayer播放Https開頭的音頻,會報這樣的錯誤:

除了去編譯ijkplayer的源碼,沒有其他選擇,編譯這玩意可把我 
坑慘了,各種不懂,碰壁,不過最后所幸還是搗鼓成功了,順道 
記錄下,方便后來者(順道吐槽下網上各種抄的文章,搜到的基本 
都是一樣的…)


2.編譯支持Https的ijkplayer

不要問我Windows上怎么編譯,反正我只會Ubuntu和MAC上編譯! 
筆者在Ubuntu 14.04 和 MAC OS 10.13 上都編譯成功了, 
在使用Ubuntu編譯的時候有個坑要注意:

不要把項目克隆到外部硬盤,比如我電腦120G的SSD 
還掛了一個1T的機械硬盤,一開始就clone到機械硬盤上了,然后編譯 
一堆問題,什么ln無法建立鏈接,chmod命令無效之類的,沒把我給毒死, 
后面clone到SSD 上一點毛病也沒有,全程綠燈!


  • Step 1安裝Git與yasm
sudo apt-get install git sudo apt-get install yasm
 
 
 
         
  • 1
  • 2

  • Step 2:下載,配置SDK與NDK

sdk就不說了,你開發安卓肯定會有的,NDK一般是不默認下載的, 
這里也不建議你使用SDK Manager下載的NDK,之前試過有些許問題, 
建議去官網下載:https://developer.android.google.cn/ndk/downloads/index.html 
NDK的最小版本支持是10e,目前不支持NDK 15!

接着是配置環境變量:

Ubuntu

設置修改下:.bashrc文件,把SDK和NDK配置上:

然后source .bashrc,鍵入ndk-build -v 看有沒有東西輸出 
驗證配置是否生效。

MAC

打開終端,cd到根目錄(cd ~),然后新建一個.bash_profile的文件: 
進行如下配置

然后輸入source .bash_profile,鍵入ndk-build -v 驗證:


  • Step 3:拉取ijkplayer源碼
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android cd ijkplayer-android git checkout -B latest k0.8.4
 
 
 
         
  • 1
  • 2
  • 3

  • Step 4:初始化android
./init-android.sh
 
 
 
         
  • 1

  • Step 5:編譯腳本配置

就是自動化編譯時的一些配置選項,比如支持什么協議啊,支持什么音視頻類型等, 
這個配置文件是:config/module.sh,你喜歡可以打開看看這個文件: 
比如這里是配置處理什么類型的數據的,enable啟用,disable禁用。

另外官方給我們提供了三個模板給我們使用:

module-default.sh:默認,如果你喜歡更多類型可以用這個; 
module-lite-hevc.sh:如果您更喜歡較小的二進制大小的編解碼器/格式(包括hevc功能) 
module-lite.sh:如果您更喜歡較小的二進制大小的編解碼器/格式(默認情況下)

反正體積最小,就用module-lite.sh這個就行了,使用也很簡單:

rm module.sh ln -s module-lite.sh module.sh source module.sh
 
 
 
         
  • 1
  • 2
  • 3

到此你還可以打開module.sh自行進行修改,比如我只想它支持mp3, 
其他格式都不支持,那么可以把不想支持的格式的enable改成disable。


  • Step 6:初始化android支持Https
cd .. ./init-android-openssl.sh
 
 
 
         
  • 1
  • 2

注:如果出現NDK或者SDK找不到,可以執行一下source ~/.bash_profile


  • Step 7:清除一波
cd android/contrib ./compile-openssl.sh clean ./compile-ffmpeg.sh clean
 
 
 
         
  • 1
  • 2
  • 3

  • Step 8:編譯openssl
./compile-openssl.sh all
 
 
 
         
  • 1

  • Step 9:編譯ffmpeg

這里的話看你需要,如果想編譯所有版本的so庫,就跟all,如果是特定 
CPU架構就跟cpu架構,比如:./compile-ffmpeg.sh armv7a 
編譯特定需要的肯定是比全部耗時短~

./compile-ffmpeg.sh all
 
 
 
         
  • 1

  • Step 10:編譯ijkplayer

加all默認編譯所有架構的so庫,不加默認只編譯armv7a架構

./compile-ijk.sh all
 
 
 
         
  • 1

編譯需要漫長的等待,編譯成功后,會在目錄下生成一個ijkplayer的工程:

到此,編譯一個支持HTTPS的ijkplayer就完成了,接着是怎么用這個東西啦:

再吐槽一句:網上很多教編譯的,到此就完了,完全不跟別人說怎么用, 
我一開始以為只要把so庫放到自己項目的libs下就可以了,結果各種編譯 
報錯,我真服了,大佬們寫文章別虎頭蛇尾啊!!!

最簡單的使用方法,就是把這個項目當成一個library導入到項目中, 
就是build.gradle里多一個compile project(‘:ijkplayer’), 
然后你就可以用了,記得把你之前寫的:

compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4' compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
 
 
 
         
  • 1
  • 2

這些依賴刪掉,不然還是會報不支持HTTPS的! 
一般到這里引用到項目里就夠了,但是小豬不是個容易滿足的人! 
所以有了下面的折騰!


3.刪減無關東西,生成aar依賴庫

覺得又很多無關的東西,說下小豬的期望吧:

  • 1.只是用來播放音樂(exo和example部分可以去掉);
  • 2.只需要armv7a架構的(刪除其他架構,並把armv7a的so庫放到ijkplayer-java);
  • 3.最后只保留一個ijkplayer-java,導出成ijkplayer.aar文件供自己的項目使用;

接着一步步來把實現小豬的期望吧:


  • Step 1:右鍵項目 Open Module Settings,點擊減號把除了ijkplayer-example 
    和ijkplayer-java的依賴都刪除:

接着打開ijkplayer-java/src/main/,新建一個libs文件夾, 
同時打開ijkplayer-armv7a/main/libs,把里面的armeabi-v7a文件 
夾整個拷到ijkplayer-java的libs文件夾下。

然后可以把除了ijkplayer-example和ijkplayer-java的其他都刪掉了, 
接着修改下ijkplayer-java的build.gradle文件,刪掉最后一句,以及 
修改下版本信息。

接着編譯一波整個工程,運行下,點開simple,隨便點首歌看看能否播放, 
如果可以正常播放,那么就進入下一步了,導出aar庫。


  • Step 2:編譯aar庫

這個倒是簡單,點擊右側gradle,依次打開,右鍵run就好

執行完畢,會在build/outputs/aar目錄下生成aar文件。


  • Step 3:把aar文件添加到項目中

這個也很簡單,直接丟到app的libs文件夾下,然后build.gradle 
下添加依賴,(筆者直接把ijkplayer-java-release.aar改名成 
ijkplayer.aar)

implementation(name: 'ijkplayer', ext: 'aar')
 
 
 
         
  • 1

接着,項目里寫個簡單的播放音樂的代碼試試水,按鈕點擊播放一個音樂:

public class MusicPlayActivity extends AppCompatActivity {     @Override     protected void onCreate(@Nullable Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_music_play);         Button btn = findViewById(R.id.button);         btn.setOnClickListener(v -> {             IjkMediaPlayer player = new IjkMediaPlayer();             player.setAudioStreamType(AudioManager.STREAM_MUSIC);             player.setScreenOnWhilePlaying(true);             player.setOnPreparedListener(IMediaPlayer::start);             try {                 player.setDataSource("https:xxxx.mp3");                 player.prepareAsync();             } catch (IOException e) {                 e.printStackTrace();             }         });     } }
 
 
 
         
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

如果播放正常的話,說明我們的移植非常成功,如果你沒有用模塊化, 
到此就可以結束了,如果你像我一樣用了模塊化,而且還把音頻播放 
獨立成了一個模塊,app -> 音頻播放模塊 -> ijkplayer.aar, 
恭喜你,編譯直接報錯,找不到aar,2333!解決方法的話,你要 
接着看下面的啦~


4.模塊化,模塊使用aar找不到問題解決

需要修改三個build.gradle文件,依次是音頻播放模塊,app,以及application層級

音頻播放模塊的build.gradle

app層級的build.gradle:

application層級的build.gradle

接着build一波項目,就可以啦~


小結

耗時幾天,總算是編譯成功,而且收獲頗多了,也懂了了一個道理: 
人難免有畏難情緒,對於學習新的東西總會下意識的抗拒,覺得難, 
但是大部分時候只是看上去難,當你去學了,並堅持一段時間,你 
會發現,其實並沒有你想象中那么難~

最后附上縮減后的ijk-player和aar包,有需要的自取: 

https://github.com/coder-pig/ijkplayer

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM