基于安卓的IJK解码库使用指南

一、环境准备

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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值