ijkplayer編譯so庫真沒那么難

引言

公司現(xiàn)在的電臺項目是我第二個接觸音頻播放項目,Android音視頻
播放很多還是使用的MediaPlayer(大中廠除外)雁竞,但是如果你用過
MediaPlayer的話,很多開發(fā)者都會吐槽有多坑拧额,連谷歌官方都推薦
使用ExoPlayer...遇到過最坑的就是播放在線音視頻的時候碑诉,網(wǎng)絡(luò)不好
會一直加載,然后點多了還容易ANR...以前就一直想把音頻播放這個
換掉侥锦,通過自行搜索和問別人进栽,又下面幾個方案(小作坊不可能
另外去寫個編解碼播放庫):

  • ExoPlayer:Demo復(fù)雜得一匹...而且網(wǎng)上的資料也不是很多,pass;
  • Vitamio:自用免費恭垦,商用收費快毛,直接就pass了;
  • 自己編譯ffmpeg:一聽就很復(fù)雜的,同樣Pass番挺;
  • ijkplayer:大B站開源的基于FFmpeg的輕量級
    Android/iOS視頻播放器唠帝,網(wǎng)上資料挺多的,而且官方
    也有維護玄柏,雖然還有1600多個issues襟衰,和mediaplayer
    差不多的接口,學(xué)習(xí)成本也不高粪摘,可以加進來試試水瀑晒!

最后就決定使用ijkplayer來替換原先的MediaPlayer了!


1.如何使用ijkplayer

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

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

dependencies {
    # 對于大部分的設(shè)備來說已經(jīng)夠用了
    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'
}

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

armv7a徘意,armv5苔悦,arm64x86椎咧,x86_64 這些是對應(yīng)的CPU架構(gòu)玖详,
一般來說準(zhǔn)備一個armv7a就基本夠了,如果系統(tǒng)找不到CPU架構(gòu)
對應(yīng)的so庫會去找armeabi,多依賴一些架構(gòu)只是稍微會快一點蟋座,
但是這樣也伴隨著apk體積的增大劳澄,這個需要你自行去權(quán)衡!r谄摺秒拔!
反正筆者就只有一個:armv7a,暫時沒發(fā)現(xiàn)什么不服飒硅!

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

ijkplayer默認(rèn)不支持HTTPS

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

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


2.編譯支持Https的ijkplayer

不要問我Windows上怎么編譯临庇,反正我只會Ubuntu和MAC上編譯反璃!
筆者在Ubuntu 14.04MAC 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

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

sdk就不說了,你開發(fā)安卓肯定會有的俯画,NDK一般是不默認(rèn)下載的析桥,
這里也不建議你使用SDK Manager下載的NDK,之前試過有些許問題,
建議去官網(wǎng)下載:https://developer.android.google.cn/ndk/downloads/index.html
NDK的最小版本支持是10e泡仗,目前不支持NDK 15埋虹!

接著是配置環(huán)境變量:

Ubuntu

設(shè)置修改下:.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

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

  • Step 5:編譯腳本配置

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

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

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

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

rm module.sh
ln -s module-lite.sh module.sh
source module.sh

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


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

注:如果出現(xiàn)NDK或者SDK找不到,可以執(zhí)行一下source ~/.bash_profile


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

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

  • Step 9:編譯ffmpeg

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

./compile-ffmpeg.sh all

  • Step 10:編譯ijkplayer

加all默認(rèn)編譯所有架構(gòu)的so庫辞友,不加默認(rèn)只編譯armv7a架構(gòu)

./compile-ijk.sh all

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

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

再吐槽一句:網(wǎng)上很多教編譯的鲫尊,到此就完了,完全不跟別人說怎么用沦偎,
我一開始以為只要把so庫放到自己項目的libs下就可以了疫向,結(jié)果各種編譯
報錯咳蔚,我真服了,大佬們寫文章別虎頭蛇尾吧ν铡L富稹!舌涨!

最簡單的使用方法糯耍,就是把這個項目當(dāng)成一個library導(dǎo)入到項目中,
就是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'

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


3.刪減無關(guān)東西系任,生成aar依賴庫

覺得又很多無關(guān)的東西,說下小豬的期望吧:

  • 1.只是用來播放音樂(exo和example部分可以去掉)虐块;
  • 2.只需要armv7a架構(gòu)的(刪除其他架構(gòu)俩滥,并把armv7a的so庫放到ijkplayer-java);
  • 3.最后只保留一個ijkplayer-java贺奠,導(dǎo)出成ijkplayer.aar文件供自己的項目使用霜旧;

接著一步步來把實現(xiàn)小豬的期望吧:


  • 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浪汪,隨便點首歌看看能否播放巴柿,
如果可以正常播放,那么就進入下一步了死遭,導(dǎo)出aar庫广恢。


  • Step 2:編譯aar庫

這個倒是簡單,點擊右側(cè)gradle殃姓,依次打開袁波,右鍵run就好

執(zhí)行完畢,會在build/outputs/aar目錄下生成aar文件蜗侈。


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

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

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

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

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();
            }
        });
    }
}

如果播放正常的話该面,說明我們的移植非常成功夭苗,如果你沒有用模塊化,
到此就可以結(jié)束了隔缀,如果你像我一樣用了模塊化题造,而且還把音頻播放
獨立成了一個模塊,app -> 音頻播放模塊 -> ijkplayer.aar猾瘸,
恭喜你界赔,編譯直接報錯,找不到aar牵触,2333淮悼!解決方法的話,你要
接著看下面的啦~


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

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

音頻播放模塊的build.gradle

app層級的build.gradle:

application層級的build.gradle

接著build一波項目羹令,就可以啦~


小結(jié)

耗時幾天,總算是編譯成功损痰,而且收獲頗多了特恬,也懂了了一個道理:
人難免有畏難情緒,對于學(xué)習(xí)新的東西總會下意識的抗拒徐钠,覺得難癌刽,
但是大部分時候只是看上去難,當(dāng)你去學(xué)了尝丐,并堅持一段時間显拜,你
會發(fā)現(xiàn),其實并沒有你想象中那么難~

最后附上縮減后的ijk-player和aar包爹袁,有需要的自仍盾:
https://github.com/coder-pig/ijkplayer


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市失息,隨后出現(xiàn)的幾起案子譬淳,更是在濱河造成了極大的恐慌档址,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻梆,死亡現(xiàn)場離奇詭異守伸,居然都是意外死亡,警方通過查閱死者的電腦和手機浦妄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門尼摹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剂娄,你說我怎么就攤上這事蠢涝。” “怎么了阅懦?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵和二,是天一觀的道長。 經(jīng)常有香客問我耳胎,道長儿咱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任场晶,我火速辦了婚禮混埠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诗轻。我一直安慰自己钳宪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布扳炬。 她就那樣靜靜地躺著吏颖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恨樟。 梳的紋絲不亂的頭發(fā)上半醉,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音劝术,去河邊找鬼缩多。 笑死,一個胖子當(dāng)著我的面吹牛养晋,可吹牛的內(nèi)容都是我干的衬吆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼绳泉,長吁一口氣:“原來是場噩夢啊……” “哼逊抡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起零酪,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤冒嫡,失蹤者是張志新(化名)和其女友劉穎拇勃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孝凌,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡方咆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胎许。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峻呛。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡罗售,死狀恐怖辜窑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寨躁,我是刑警寧澤穆碎,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站职恳,受9級特大地震影響所禀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜放钦,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一色徘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧操禀,春花似錦褂策、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揪惦,卻和暖如春遍搞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背器腋。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工溪猿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纫塌。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓再愈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親护戳。 傳聞我的和親對象是個殘疾皇子翎冲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容