ijkplayer編譯so庫(kù)真沒(méi)那么難

作者:coder-pig 鏈接:https://juejin.cn/post/6844903554084241415

ijkplayer播放器設(shè)計(jì)原理分析:https://www.bilibili.com/video/BV15V411t713

ffplay / ijkplayer / vlc的播放器設(shè)計(jì)實(shí)現(xiàn):https://www.bilibili.com/video/BV1664y1t7sE

ijkplayer:大B站開(kāi)源的基于FFmpeg的輕量級(jí) Android/iOS視頻播放器疆瑰,網(wǎng)上資料挺多的,而且官方 也有維護(hù)昙啄,雖然還有1600多個(gè)issues穆役,和mediaplayer 差不多的接口,學(xué)習(xí)成本也不高梳凛,可以加進(jìn)來(lái)試試水耿币!

1.如何使用ijkplayer

官方github.com/Bilibili/ij…

build.gradle添加下述依賴(lài)引用即可:

dependencies {
    # 對(duì)于大部分的設(shè)備來(lái)說(shuō)已經(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'
}

這里簡(jiǎn)單說(shuō)點(diǎn)東西來(lái)解除你可能存在的一些疑惑:

armv7aarmv5韧拒,arm64淹接,x86x86_64 這些是對(duì)應(yīng)的CPU架構(gòu)叛溢, 一般來(lái)說(shuō)準(zhǔn)備一個(gè)armv7a就基本夠了塑悼,如果系統(tǒng)找不到CPU架構(gòu) 對(duì)應(yīng)的so庫(kù)會(huì)去找armeabi,多依賴(lài)一些架構(gòu)只是稍微會(huì)快一點(diǎn)楷掉, 但是這樣也伴隨著apk體積的增大厢蒜,這個(gè)需要你自行去權(quán)衡!!斑鸦! 反正筆者就只有一個(gè):armv7a愕贡,暫時(shí)沒(méi)發(fā)現(xiàn)什么不服!

然后使用方法和MediaPlayer大同小異巷屿,這就不另外講述怎么 使用了固以,網(wǎng)上一搜也很多。接下來(lái)要說(shuō)下筆者遇到的一個(gè)問(wèn)題:

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

是的攒庵,不支持嘴纺,如果你嘗試使用ijkplayer播放Https開(kāi)頭的音頻褐墅,會(huì)報(bào)這樣的錯(cuò)誤:

image.png

除了去編譯ijkplayer的源碼泡躯,沒(méi)有其他選擇社证,編譯這玩意可把我 坑慘了咧叭,各種不懂律想,碰壁儡羔,不過(guò)最后所幸還是搗鼓成功了冯勉,順道 記錄下纷妆,方便后來(lái)者(順道吐槽下網(wǎng)上各種抄的文章场梆,搜到的基本 都是一樣的...)!
image.png

2.編譯支持Https的ijkplayer

不要問(wèn)我Windows上怎么編譯墅冷,反正我只會(huì)Ubuntu和MAC上編譯! 筆者在Ubuntu 14.04MAC OS 10.13上都編譯成功了或油, 在使用Ubuntu編譯的時(shí)候有個(gè)坑要注意:

不要把項(xiàng)目克隆到外部硬盤(pán)寞忿,比如我電腦120G的SSD 還掛了一個(gè)1T的機(jī)械硬盤(pán),一開(kāi)始就clone到機(jī)械硬盤(pán)上了顶岸,然后編譯 一堆問(wèn)題腔彰,什么ln無(wú)法建立鏈接,chmod命令無(wú)效之類(lèi)的辖佣,沒(méi)把我給毒死霹抛, 后面clone到SSD 上一點(diǎn)毛病也沒(méi)有,全程綠燈卷谈!

Step 1安裝Git與yasm

sudo apt-get install git
sudo apt-get install yasm

Step 2:下載杯拐,配置SDK與NDK

sdk就不說(shuō)了,你開(kāi)發(fā)安卓肯定會(huì)有的世蔗,NDK一般是不默認(rèn)下載的端逼, 這里也不建議你使用SDK Manager下載的NDK,之前試過(guò)有些許問(wèn)題凸郑, 建議去官網(wǎng)下載:developer.android.google.cn/ndk/downloa… NDK的最小版本支持是10e裳食,目前不支持NDK 15!

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

Ubuntu

設(shè)置修改下:.bashrc文件芙沥,把SDK和NDK配置上:

image.png

然后source .bashrc,鍵入ndk-build -v看有沒(méi)有東西輸出 驗(yàn)證配置是否生效。


image.png

MAC

打開(kāi)終端而昨,cd到根目錄(cd ~)救氯,然后新建一個(gè).bash_profile的文件: 進(jìn)行如下配置

image.png

然后輸入source .bash_profile,鍵入ndk-build -v驗(yàn)證:

image.png

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:編譯腳本配置

就是自動(dòng)化編譯時(shí)的一些配置選項(xiàng)歌憨,比如支持什么協(xié)議啊着憨,支持什么音視頻類(lèi)型等, 這個(gè)配置文件是:config/module.sh务嫡,你喜歡可以打開(kāi)看看這個(gè)文件: 比如這里是配置處理什么類(lèi)型的數(shù)據(jù)的甲抖,enable啟用,disable禁用心铃。

image.png

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

image.png

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

反正體積最小去扣,就用module-lite.sh這個(gè)就行了柱衔,使用也很簡(jiǎn)單:

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

到此你還可以打開(kāi)module.sh自行進(jìn)行修改,比如我只想它支持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庫(kù),就跟all朋其,如果是特定 CPU架構(gòu)就跟cpu架構(gòu)王浴,比如:./compile-ffmpeg.sh armv7a編譯特定需要的肯定是比全部耗時(shí)短~

./compile-ffmpeg.sh all

Step 10:編譯ijkplayer

加all默認(rèn)編譯所有架構(gòu)的so庫(kù),不加默認(rèn)只編譯armv7a架構(gòu)令宿!

./compile-ijk.sh all

編譯需要漫長(zhǎng)的等待叼耙,編譯成功后,會(huì)在目錄下生成一個(gè)ijkplayer的工程:


image.png
image.png

到此粒没,編譯一個(gè)支持HTTPS的ijkplayer就完成了筛婉,接著是怎么用這個(gè)東西啦:

再吐槽一句:網(wǎng)上很多教編譯的,到此就完了癞松,完全不跟別人說(shuō)怎么用爽撒, 我一開(kāi)始以為只要把so庫(kù)放到自己項(xiàng)目的libs下就可以了,結(jié)果各種編譯 報(bào)錯(cuò)响蓉,我真服了硕勿,大佬們寫(xiě)文章別虎頭蛇尾啊7慵住T次洹扼褪!

最簡(jiǎn)單的使用方法,就是把這個(gè)項(xiàng)目當(dāng)成一個(gè)library導(dǎo)入到項(xiàng)目中粱栖, 就是build.gradle里多一個(gè)compile project(':ijkplayer')话浇, 然后你就可以用了,記得把你之前寫(xiě)的:

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

這些依賴(lài)刪掉闹究,不然還是會(huì)報(bào)不支持HTTPS的幔崖! 一般到這里引用到項(xiàng)目里就夠了,但是小豬不是個(gè)容易滿足的人渣淤! 所以有了下面的折騰赏寇!

3.刪減無(wú)關(guān)東西,生成aar依賴(lài)庫(kù)

覺(jué)得又很多無(wú)關(guān)的東西价认,說(shuō)下小豬的期望吧:

  • 1.只是用來(lái)播放音樂(lè)(exo和example部分可以去掉)嗅定;
  • 2.只需要armv7a架構(gòu)的(刪除其他架構(gòu),并把a(bǔ)rmv7a的so庫(kù)放到ijkplayer-java)刻伊;
  • 3.最后只保留一個(gè)ijkplayer-java露戒,導(dǎo)出成ijkplayer.aar文件供自己的項(xiàng)目使用;

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

Step 1:右鍵項(xiàng)目 Open Module Settings捶箱,點(diǎn)擊減號(hào)把除了ijkplayer-example 和ijkplayer-java的依賴(lài)都刪除:


image.png

接著打開(kāi)ijkplayer-java/src/main/智什,新建一個(gè)libs文件夾, 同時(shí)打開(kāi)ijkplayer-armv7a/main/libs,把里面的armeabi-v7a文件 夾整個(gè)拷到ijkplayer-java的libs文件夾下丁屎。


image.png

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


image.png

接著編譯一波整個(gè)工程,運(yùn)行下共虑,點(diǎn)開(kāi)simple愧怜,隨便點(diǎn)首歌看看能否播放, 如果可以正常播放妈拌,那么就進(jìn)入下一步了拥坛,導(dǎo)出aar庫(kù)。

Step 2:編譯aar庫(kù)

這個(gè)倒是簡(jiǎn)單尘分,點(diǎn)擊右側(cè)gradle猜惋,依次打開(kāi),右鍵run就好


image.png

執(zhí)行完畢培愁,會(huì)在build/outputs/aar目錄下生成aar文件著摔。


image.png

Step 3:把a(bǔ)ar文件添加到項(xiàng)目中

這個(gè)也很簡(jiǎn)單,直接丟到app的libs文件夾下定续,然后build.gradle 下添加依賴(lài)谍咆,(筆者直接把ijkplayer-java-release.aar改名成 ijkplayer.aar)

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

接著禾锤,項(xiàng)目里寫(xiě)個(gè)簡(jiǎn)單的播放音樂(lè)的代碼試試水,按鈕點(diǎn)擊播放一個(gè)音樂(lè):

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

如果播放正常的話卧波,說(shuō)明我們的移植非常成功时肿,如果你沒(méi)有用模塊化庇茫,
到此就可以結(jié)束了港粱,如果你像我一樣用了模塊化,而且還把音頻播放
獨(dú)立成了一個(gè)模塊旦签,app -> 音頻播放模塊 -> ijkplayer.aar查坪,
恭喜你,編譯直接報(bào)錯(cuò)宁炫,找不到aar偿曙,2333!解決方法的話羔巢,你要
接著看下面的啦~

4.模塊化望忆,模塊使用aar找不到問(wèn)題解決

需要修改三個(gè)build.gradle文件,依次是音頻播放模塊竿秆,app启摄,以及application層級(jí)

音頻播放模塊的build.gradle:

image.png

app層級(jí)的build.gradle:
image.png

application層級(jí)的build.gradle
image.png

接著build一波項(xiàng)目,就可以啦~

小結(jié)

耗時(shí)幾天幽钢,總算是編譯成功歉备,而且收獲頗多了,也懂了了一個(gè)道理: 人難免有畏難情緒匪燕,對(duì)于學(xué)習(xí)新的東西總會(huì)下意識(shí)的抗拒蕾羊,覺(jué)得難, 但是大部分時(shí)候只是看上去難帽驯,當(dāng)你去學(xué)了龟再,并堅(jiān)持一段時(shí)間,你 會(huì)發(fā)現(xiàn)尼变,其實(shí)并沒(méi)有你想象中那么難~

image.png

最后附上縮減后的ijk-player和aar包利凑,有需要的自取: github.com/coder-pig/i…

FFmpeg/WebRTC/RTMP音視頻流媒體高級(jí)開(kāi)發(fā)學(xué)習(xí):https://ke.qq.com/course/3202131

image.png

FFmpeg/WebRTC/RTMP音視頻流媒體高級(jí)開(kāi)發(fā)學(xué)習(xí)資料享甸、教學(xué)視頻和學(xué)習(xí)路線圖 資料獲取

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末截碴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛉威,更是在濱河造成了極大的恐慌日丹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚯嫌,死亡現(xiàn)場(chǎng)離奇詭異哲虾,居然都是意外死亡丙躏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)束凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晒旅,“玉大人,你說(shuō)我怎么就攤上這事汪诉》狭担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵扒寄,是天一觀的道長(zhǎng)鱼鼓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)该编,這世上最難降的妖魔是什么迄本? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮课竣,結(jié)果婚禮上嘉赎,老公的妹妹穿的比我還像新娘。我一直安慰自己于樟,他們只是感情好公条,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著隔披,像睡著了一般赃份。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奢米,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天抓韩,我揣著相機(jī)與錄音,去河邊找鬼鬓长。 笑死谒拴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涉波。 我是一名探鬼主播英上,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啤覆!你這毒婦竟也來(lái)了苍日?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窗声,失蹤者是張志新(化名)和其女友劉穎相恃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笨觅,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拦耐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年耕腾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杀糯。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扫俺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出固翰,到底是詐尸還是另有隱情狼纬,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布倦挂,位于F島的核電站畸颅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏方援。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一涛癌、第九天 我趴在偏房一處隱蔽的房頂上張望犯戏。 院中可真熱鬧,春花似錦拳话、人聲如沸先匪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呀非。三九已至,卻和暖如春镜盯,著一層夾襖步出監(jiān)牢的瞬間岸裙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工速缆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留降允,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓艺糜,卻偏偏與公主長(zhǎng)得像剧董,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子破停,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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