安卓

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)
上一篇下一篇

猜你喜欢

热点阅读