題外話:ijkplayer 爲什麼叫 ijk呢? 本人好奇查了一下,ijk應該是「愛 JK」的縮寫 ,而「JK」這個詞是日本的網絡流行語,取自「女子高校生」日語的羅馬音簡寫,也就是女高中生的意思(~( ̄▽ ̄~)(~ ̄▽ ̄)~),哈哈,懂的都懂,B站這個開源播放器取名老二次元了。不廢話了,進入正題。java
系統軟件 | 版本 | 功能 |
---|---|---|
macOs | 10.15.5 | 系統 |
Homebrew | 2.4.4 | 軟件包管理工具 |
jdk | java version "1.8.0_251" | Java開發工具 |
git | 2.27.0 | 版本控制 |
yasm | 1.3.0 | 彙編編譯器 |
NDK | android-ndk-r14b | Android NDK 是一個工具集,可以讓您使用 C 和 C++ 等語言以原生代碼實現應用的各個部分(注意編譯ijkplayer NDK 版本控制在 r10 ~ r14 範圍) |
Android Studio | 4.0 | Android 開發IDE |
CPU 架構類型 | 說明 |
---|---|
armeabi/mips / mips64 | 第5代、第6代的ARM處理器,早期的手機用的比較多,NDK 之前支持 ARMv5 (armeabi) 以及 32 位和 64 位 MIPS,但 NDK r17 已再也不支持 |
armeabi-v7a | 第7代及以上的 ARM,此 ABI 適用於基於 32 位 ARM 的 CPU 處理器。 |
arm64-v8a | 此 ABI 適用於基於 ARMv8-A 的 CPU,第8代、64位ARM處理器,目前市場主流的版本 |
x86 、x86_64 | intel CPU , 平板、模擬器、64位的平板 |
adb -s 設備名稱 shell getprop ro.product.cpu.abi 複製代碼
自行下載git,yasm,Android sdk、ndk、並配置環境變量,下面給出Android sdk、ndk環境變量配置linux
git、yasm 安裝android
brew install git
brew install yasm
複製代碼
export ANDROID_SDK=/Users/{你的路徑XXX}/Library/Android/sdk export ANDROID_NDK=/Users/{你的路徑XXX}/Library/Android/ndk/android-ndk-r14b export PATH=$PATH:$ANDROID_SDK/tools export PATH=$PATH:$ANDROID_SDK/platform-tools export PATH=$PATH:$ANDROID_NDK 複製代碼
# clone項目 git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android # 進入ijkplayer-android目錄 cd ijkplayer-android # 切換到最新代碼分支 git checkout -B latest k0.8.8 # 會檢查下載ffmpeg代碼 ./init-android.sh #初始化openSSL(使ijk編譯後支持https) ./init-android-openssl.sh 複製代碼
## 支持解碼格式 # ./configure --list-decoders export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac_latm" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flv" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h264" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp3*" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp6f" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flac" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=hevc" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp8" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp9" 複製代碼
#If you prefer more codec/format cd config rm module.sh ln -s module-default.sh module.sh #If you prefer less codec/format for smaller binary size (include hevc function) cd config rm module.sh ln -s module-lite-hevc.sh module.sh #If you prefer less codec/format for smaller binary size (by default) cd config rm module.sh ln -s module-lite.sh module.sh 複製代碼
./compile-openssl.sh clean//清除
./compile-ffmpeg.sh clean//清除
./compile-openssl.sh all//編譯
./compile-ffmpeg.sh all//編譯
複製代碼
注意本步驟須要贊成不受信任軟件權限,具體參考地址git
# 注意回到android 路徑下 cd .. # 執行腳步生成so 文件 ./compile-ijk.sh all 複製代碼
ext { compileSdkVersion = 30 buildToolsVersion = "30.0.0" targetSdkVersion = 30 versionCode = 800800 versionName = "0.8.8" } 複製代碼
這個項目,他自己是一個可運行的項目,而且依賴前面編譯好的各個版本動態連接庫 library,將其變爲library 則修改該模塊 build.gradle 將 apply plugin: 'com.android.application' 改成 apply plugin: 'com.android.library'。github
ijkplayer-example 的清單文件還設置了啓動的 Activity過濾器,將其刪除shell
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 複製代碼
POM_NAME=ijkplayer-example
POM_ARTIFACT_ID=ijkplayer-example
POM_PACKAGING=aar
複製代碼
implementation project(':ijkplayer-example') 複製代碼
/** * 簡單使用 ijkplayer demo 提供的 IjkVideoView */ class MainActivity : AppCompatActivity() { private var setting:Settings? = null private var mAndroidMediaController:AndroidMediaController? =null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setting = Settings(this) mAndroidMediaController = AndroidMediaController(this,false) IjkMediaPlayer.loadLibrariesOnce(null) IjkMediaPlayer.native_profileBegin("libijkplayer.so") //https val mVideoPath1 = "https://www.apple.com/105/media/us/iphone-x/2017/01df5b43-28e4-4848-bf20-490c34a926a7/films/feature/iphone-x-feature-tpl-cc-us-20170912_1920x1080h.mp4" //rtmp val mVideoPath2 = "rtmp://58.200.131.2:1935/livetv/hunantv" //hls val mVideoPath3 = "http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8" //rtsp val mVideoPath4 = "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov" mVideoView.setMediaController(mAndroidMediaController) mVideoView.setHudView(video_msg) editVideoPath.setText(mVideoPath3) btplay.setOnClickListener{ if (TextUtils.isEmpty(editVideoPath.text)) { Toast.makeText(this, "視頻地址不能爲空", Toast.LENGTH_LONG).show(); } else { mVideoView.setVideoURI(Uri.parse(editVideoPath.text.toString().trim())) mVideoView.start() } } } override fun onDestroy() { super.onDestroy() mVideoView.stopPlayback() mVideoView.release(true) mVideoView.stopBackgroundPlay() IjkMediaPlayer.native_profileEnd() } } 複製代碼
ijkplayerdemobash
export ANDROID_SDK=/Users/{你的路徑XXX}/Library/Android/sdk export ANDROID_NDK=/Users/{你的路徑XXX}/Library/Android/ndk/android-ndk-r14b export PATH=$PATH:$ANDROID_SDK/tools export PATH=$PATH:$ANDROID_SDK/platform-tools export PATH=$PATH:$ANDROID_NDK 複製代碼
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib" 複製代碼