题外话: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" 复制代码