一、环境准备
1、ubuntu环境
2、Android studio
二、软件安装
1、ubuntu系统需要安装 :NDK、Android-sdk、JDK
其中NDK和android-sdk需要配置到环境里面
export PATH=/home/stevin/Android_SDK/android-sdk-linux/platform-tools:$PATH
export PATH=/home/stevin/Android_SDK/android-sdk-linux/tools:$PATH
export ANDROID_NDK=/home/stevin/NDK/android-ndk-r10e
export PATH=/home/stevin/NDK/android-ndk-r10e:$PATH
一定要定义ANDROID_NDK这个环境变量
2、ubuntu可能还需要安装一下:
sudo apt-get update
sudo apt-get install git
sudo apt-get install yasm
三、下载IJK-Android解码库代码
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
四、编译
cd ijkplayer-android
git checkout -B latest k0.8.8 切换分支及相应的版本
由于代码里面默认的配置文件编译出来的库不能解码部分音频文件,需要使用代码原始配置文件(module-default.sh)
配置文件在ijkplayer-android\config目录下
sudo rm module.sh
ln -s module-default.sh module.sh
source module.sh
./init-android.sh 编译初始化,这里需要下载ffmpeg的库,和网络环境有关,可能会失败
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all 编译ffmpeg的全平台的库
cd ..
./compile-ijk.sh all 编译libijkplayer.so 和libijksdl.so
编译成之后需要提取三个so文件(libijkplayer.so、libijksdl.so和libijkffmpeg.so)以及ijkplayer-java文件夹
ijkplayer-java事作为ijk的接口文件,可以自行编译成jar包或者aar文件导入studio工程
这些文件均在ijkplayer-android\android\ijkplayer目录下
五、Android sutdio工程demo
1、studio需要配置NDK编译
2、选择NDK适配的CPU结构
3、工程需要导入ijkplayer-java包
4、添加so打包
build.gradle涉及到的主要配置有
sourceSets {
main {
jni.srcDirs = [] //这一行加不加都可以
jniLibs.srcDirs = ['libs']//这个必须加,因为我们把.so文件放在了libs文件夹中
}
}
ndk {
abiFilters "armeabi", "arm64-v8a"
}
ndkVersion '16.1.4479499'
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':ijkplayer-java')
整个build.gradle配置如下
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.jmc.jmcijkplayertest"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "armeabi", "arm64-v8a"
}
}
sourceSets {
main {
jni.srcDirs = [] //这一行加不加都可以
jniLibs.srcDirs = ['libs']//这个必须加,因为我们把.so文件放在了libs文件夹中
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
ndkVersion '16.1.4479499'
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
compile project(':ijkplayer-java')
}
IJK接口使用的核心代码
1、工程启动时间需要加载IJK库
IjkMediaPlayer.loadLibrariesOnce(null); IjkMediaPlayer.native_profileBegin("libijkplayer.so");
2、接口使用方法与安卓原生的MediaPlayer的使用方法一直
IjkMediaPlayer ijkMediaPlayer = null;
ijkMediaPlayer = new IjkMediaPlayer(); try { ijkMediaPlayer.setDataSource("/storage/emulated/0/song/Beyond - 光辉岁月.ape"); ijkMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); ijkMediaPlayer.prepareAsync(); ijkMediaPlayer.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() { @Override public void onPrepared(IMediaPlayer mp) { // mHandler.sendEmptyMessageDelayed(0,2000); ijkMediaPlayer.start(); } }); ijkMediaPlayer.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() { @Override public void onCompletion(IMediaPlayer mp) { Log.d(TAG, "onCompletion: "); } }); ijkMediaPlayer.setOnErrorListener(new IMediaPlayer.OnErrorListener() { @Override public boolean onError(IMediaPlayer mp, int what, int extra) { Log.d(TAG, "onError: "); return false; } }); } catch (IOException e) { e.printStackTrace(); }
3、需要注意的地方就是在加载IJK库需要一定的时间(虽然时间不长),
IJKmediaplayer的数据加载和播放需要在IJK库加之后过一段时间使用,
否则会出现播放异常。
ijk Android-demo工程可参考
https://download.csdn.net/download/cjf287430429/18899825