IjkPlayer For Android源码下载及编译
2018-05-18 本文已影响58人
Weller0
1、源码下载 & 编译
IjkPlayer官方github地址:https://github.com/Bilibili/ijkplayer
编译的话可以直接参考官方文档
以下引至官方文档
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android #下载源码
cd ijkplayer-android
git checkout -B latest k0.8.8 #切换到最新release分支
./init-android.sh #下载ffmpeg等第三方依赖
cd android/contrib
./compile-ffmpeg.sh clean #清除ffmpeg编译
./compile-ffmpeg.sh all #编译ffmpeg;all是编译所有平台,一般Android选择编译armv7a,arm64即可(./compile-ffmpeg.sh armv7a|arm64)
cd ..
./compile-ijk.sh all #编译ijkplayer;all是编译所有平台,一般Android选择编译armv7a,arm64即可(./compile-ijk.sh armv7a|arm64)
各个平台编译结束位置(./ijkplayer-android/android/ijkplayer/)如下图
平台文件目录
将会在平台目录下的{平台目录}/src/main/libs/{平台}下生成libijkffmpeg.so、libijkplayer.so、libijksdl.so这三个库文件
对应的JAVA接口文件在ijkplayer-android/android/ijkplayer/ijkplayer-java/build/outputs/aar/ijkplayer-java-release.aar,这个aar文件中没有任何资源文件,可以直接使用解压工具把里面的class.jar拷贝出来使用,以免出现多层级aar调用引起问题(我使用的是jar文件ijk_player.jar)
我们将会使用java接口文件和上面提及的三个so文件
2、项目中依赖
把java接口文件和so文件拷贝到Module根目录的libs目录下
在将要使用的Module的build.gradle中添加so依赖路径
在gradle的Android节点下添加so库文件的依赖
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
在dependencies节点下添加jar文件的依赖
implementation files('libs/ijk_player.jar')
3、使用IjkMediaPlayer实现播放视频
IjkMediaPlayer使用与MediaPlayer完全一致,自行网上搜索MediaPlayer用法
以下给出一个Demo
mediaPlayer = new IjkMediaPlayer();
mediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_WARN);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);// 优先使用硬解码
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-all-videos", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-sync", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
try {
mediaPlayer.setDataSource("/sdcard/Movies/test.mp4");
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.prepareAsync();
mediaPlayer.setLooping(true);
mediaPlayer.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(IMediaPlayer iMediaPlayer) {
mediaPlayer.start();
MediaInfo info = mediaPlayer.getMediaInfo();
Log.d(TAG, "VideoDecoder:"+info.mVideoDecoder);
Log.d(TAG, "AudioDecoder:"+info.mAudioDecoder);
}
});
我是通过OpenGL显示的,需要把你GLSurfaceView的surface传给播放器
mediaPlayer.setSurface(surface)