從零開始仿寫一個BiliBili客戶端之編譯ijkplayer

靚仔凌霄發表於2019-04-29

章節

從零開始仿寫一個B站客戶端之-編譯ijkplayer

從零開始仿寫一個B站客戶端之-抓包B站介面

從零開始仿寫一個B站客戶端之-使用ijkplayer打造一個通用的播放器

從零開始仿寫一個B站客戶端之-整體架構設計和網路請求封裝

寫在之前

之前一直在研究Android平臺自帶的mediacodec進行音視訊的編解碼,在使用一段時間之後,直觀的感受是比較繁瑣,相容性不夠好。本著學到老活到老的態度,嘗試使用ijkplayer,為啥不從ffmpeg開始呢?學習嘛,都是從易到難得一個過程,我喜歡先從簡單的開始學起走。學框架比較枯燥,最好能在專案中運用到所學的東西,既然ijkplayer是bilibili的開源播放器,那實現一個仿B站的Android客戶端,是一個不錯的選擇。

專案地址:仿BiliBili客戶端

下載體驗:蒲公英

演示效果:

從零開始仿寫一個BiliBili客戶端之編譯ijkplayer

如果覺得專案不錯,歡迎給個star喲~

準備工作

BiliBIli的核心當然是視訊播放啦,視訊播放就離不開ijkplayer,那什麼是ijkplayer呢?ijkplayer是 BiliBIli開源的一款基於ffmpeg的優秀的播放器,支援Android/iOS,實現了跨平臺的功能。並且這個播放器軟硬通吃,在受到mediacodec折磨幾個月之後,換用ijkplayer簡直爽的一批。

話不多說,先放上ijkplayer的github地址:

專案地址:ijkplayer開源播放器

整合方式:

# required, enough for most devices.
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
複製程式碼

嗯。。我不打算這樣直接引入,因為根據網上的說法,官方的這個包是不支援https和rtsp,rtmp的,這樣顯然不符合我國際程式猿的身份(戰術後仰~)。

編譯環境

我使用的是ubuntu16.04 64位作業系統,將nkd,yasm,git環境配置好。

sudo apt-get install yasm
sudo apt-get install git
複製程式碼

ndk下載配置:developer.android.google.cn/ndk/guides/

這裡注意ndk版本不要太高或者太低,我使用的是android-ndk-r10e,官方推薦的這個版本。會少走很多彎路。

如果不想要自己編譯,也可以拿我編譯好的:

ijkplayer.zip

下載原始碼並編譯

在磁碟中新建一個資料夾,用於存放原始碼, 開啟終端輸入如下指令:

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
# 切換分支 0.8.8是最新的
git checkout -B latest k0.8.8
複製程式碼

下載完成之後,在ijkplayer-android/config這個資料夾中,可以配置編碼器格式支援,它給了三個模板供我們使用:

  • module-default.sh 更多的編解碼器/格式
  • module-lite-hevc.sh 較少的編解碼器/格式(包括hevc)
  • module-lite.sh 較少的編解碼器/格式(預設情況)

從零開始仿寫一個BiliBili客戶端之編譯ijkplayer

預設的編譯選項是不支援rtsp協議和https的,需要加入下面編譯配置:

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=tcp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=sdp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"
複製程式碼

我是在module-lite-hevc.sh的基礎上修改的,修改完成之後軟連結到module.sh:

rm module.sh
ln -s module-lite-hevc.sh module.sh
複製程式碼

上面的修改完成後便可以開始編譯了,cd 到 ijkplayer-android,執行:

// checkout ffmpeg 原始碼,預設從 https://github.com/Bilibili/FFmpeg.git checkout
./init-android.sh
./init-android-openssl.sh
//cd 到 ijkplayer-android/android/contrib 目錄下,Android下編譯指令碼放在該目錄下
cd android/contrib
// 編譯 openssl
./compile-openssl.sh clean
./compile-openssl.sh all
//編譯 ffmpeg
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
//cd 到ijkplayer-android/android目錄下 開始編譯ijkplayer
./compile-ijk.sh all
複製程式碼

漫長的等待之後,編譯完成後的東西就放在 ijkplayer-android/android/ijkplayer目錄下。此時編譯好的 so 是支援 https 協議的。

從零開始仿寫一個BiliBili客戶端之編譯ijkplayer

編譯成功之後打包好的檔案:ijkplayer.zip

ijkplayer-android/android/ijkplayer/ijkplayer-example 是一個 example ,裡面有 ijkplayer 的使用示例。

我們只需要將編譯出來的so放入工程中的src\main 目錄下的jniLibs 目錄中,並且在專案中新增 ijkplayer-java 依賴即可:

compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
//使用我們自己的so 註釋掉下面這個
//compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
複製程式碼

以上完成之後,可以結合example來進行使用了,大致操作就是這麼些東西。

目前完成的功能

  • 整體架構搭建
  • 對b站客戶端抓包,分析介面
  • 主介面佈局完成
  • 完成直播播放頁面
  • 完成推薦視訊的播放
  • 視訊彈幕獲取

專案截圖:

直播介面 聊天介面 個人資訊popwindow 主播資訊介面 粉絲榜 大航海
從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer
視訊播放 視訊評論 側滑 分割槽 追番 webview
從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer 從零開始仿寫一個BiliBili客戶端之編譯ijkplayer

相關文章