本文轉載:ijkplayer編譯so庫真沒那么難;
1.如何使用ijkplayer
官方:https://github.com/Bilibili/ijkplayer
build.gradle添加下述依賴引用即可:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
這里簡單說點東西來解除你可能存在的一些疑惑:
armv7a,armv5,arm64,x86,x86_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:
- 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源碼
- 1
- 2
- 3
- Step 4:初始化android
- 1
- Step 5:編譯腳本配置
就是自動化編譯時的一些配置選項,比如支持什么協議啊,支持什么音視頻類型等,
這個配置文件是:config/module.sh,你喜歡可以打開看看這個文件:
比如這里是配置處理什么類型的數據的,enable啟用,disable禁用。
另外官方給我們提供了三個模板給我們使用:
module-default.sh:默認,如果你喜歡更多類型可以用這個;
module-lite-hevc.sh:如果您更喜歡較小的二進制大小的編解碼器/格式(包括hevc功能)
module-lite.sh:如果您更喜歡較小的二進制大小的編解碼器/格式(默認情況下)
反正體積最小,就用module-lite.sh這個就行了,使用也很簡單:
- 1
- 2
- 3
到此你還可以打開module.sh自行進行修改,比如我只想它支持mp3,
其他格式都不支持,那么可以把不想支持的格式的enable改成disable。
- Step 6:初始化android支持Https
- 1
- 2
注:如果出現NDK或者SDK找不到,可以執行一下source ~/.bash_profile
- Step 7:清除一波
- 1
- 2
- 3
- Step 8:編譯openssl
- 1
- Step 9:編譯ffmpeg
這里的話看你需要,如果想編譯所有版本的so庫,就跟all,如果是特定
CPU架構就跟cpu架構,比如:./compile-ffmpeg.sh armv7a
編譯特定需要的肯定是比全部耗時短~
- 1
- Step 10:編譯ijkplayer
加all默認編譯所有架構的so庫,不加默認只編譯armv7a架構!
- 1
編譯需要漫長的等待,編譯成功后,會在目錄下生成一個ijkplayer的工程:
到此,編譯一個支持HTTPS的ijkplayer就完成了,接着是怎么用這個東西啦:
再吐槽一句:網上很多教編譯的,到此就完了,完全不跟別人說怎么用,
我一開始以為只要把so庫放到自己項目的libs下就可以了,結果各種編譯
報錯,我真服了,大佬們寫文章別虎頭蛇尾啊!!!
最簡單的使用方法,就是把這個項目當成一個library導入到項目中,
就是build.gradle里多一個compile project(‘:ijkplayer’),
然后你就可以用了,記得把你之前寫的:
- 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)
- 1
接着,項目里寫個簡單的播放音樂的代碼試試水,按鈕點擊播放一個音樂:
- 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