欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ijkplayer-android编译与使用说明

程序员文章站 2024-03-22 23:05:46
...

经过一番折腾与踩坑,终于在Ubuntu成功编译了ijkplayer源码,并成功在自己的demo调用ijkplayer库实现视频播放。在此对之前的编译及demo调用进行总结。

1、在Ubuntu系统进行ijkplayer编译

Ubuntu版本为18.04LTS。根据官网介绍,在编译之前需要先做一些环境配置准备。

ijkplayer-android编译与使用说明

1、首先安装Android SDK和NDK。

sdk下载地址:http://developer.android.com/sdk/index.html 。我这里下载的是android-studio-ide-173.4819257-linux.zip。通过启动Android studio下载sdk。

将android-studio-ide-173.4819257-linux.zip拷贝到你要存放的位置。执行如下命令:

unzip android-studio-ide-173.4819257-linux.zip

cd android-studio/bin

sh studio.sh

之前完上面的命令后,会下载sdk到如下目录:~/Android/sdk

ndk下载地址: https://developer.android.com/ndk/downloads/index.html#download。刚开始下载的版本是android-ndk-r16b-linux-x86_64.zip。但是在编译源码的时候报错了,通过查看官方issue得知最高版本不能高于r14。后来使用android-ndk-r10e-linux-x86_64.zip成功通过编译了。

同样将ndk压缩包拷贝到你想要存放的目录下,执行如下命令:

unzip android-ndk-r10e-linux-x86_64.zip

然后配置sdk和ndk路径。打开.vim ~/.bashrc

#set path ofANDROID_SDK and ANDROID_NDK
export ANDROID_SDK=/home/liuz4/Android/Sdk

export ANDROID_NDK=/home/liuz4/WorkDir/Android/android-ndk-r10e
export PATH=$ANDROID_NDK:$PATH

然后执行命令:source ~/.bashrc 。这样sdk和ndk就安装好了。

2、安装git、make、yasm

sudo apt-get update
sudo apt-get install git
sudo apt-get install yasm
sudo apt-get install make

3、编译步骤。具体可以查看官网(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

./init-android.sh

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

cd ..
./compile-ijk.sh all

这里需要注意的是,上面的ndk解压时,不能用sudo,否则在执行compile-ffmpeg.sh时,会提示ndk版本太低。

2、使用编译成功的ijkplayer库。

上面如果编译成功了,会生成ijkplayer-android/android/ijkplayer。将该目录整个拷贝出来,导入到Android studio。由于我使用的是虚拟机,直接拷贝文件夹会失败。需要先压缩后,拷贝出来再解压缩。

ijkplayer目录实际上就是一个project。直接用Android studio,File->open 导入进行编译,编译成功后,导入手机,选择手机上的视频文件进行播放。到这里即可验证我们成功编译了ijkplayer。

由于官方的demo比较多,如果需要自己创建一个精简demo。可以通过如下步骤创建 一个自己demo。

ijkplayer中包含了如下几个目录。其中,ijkplayer-arm64,ijkplayer-armv5,ijkplayer-armv7a,ijkplayer-x86,ijkplayer-x86_64是不同体系架构的动态链接库。通常我们使用的是ijkplayer-armv7a这个目录的架构。

ijkplayer-android编译与使用说明

1、新建工程,将你需要的平台so库拷贝到libs目录下。

ijkplayer-android编译与使用说明

2、再将编译后的ijkplayr工程目录下的ijkplayer-java/build/outputs/arr/ijkplayer-java-release.arr也复制到新建工程文件的libs目录下。

3、 修改新建工程app模块下的build.gradle文件

ijkplayer-android编译与使用说明

ijkplayer-android编译与使用说明

4、程序代码:

public class ijkPlayerSimpleTest extends AppCompatActivity implements SurfaceHolder.Callback{
    private IjkMediaPlayer mPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ijk_player_simple_test);
        initSurfaceView();
        initPlayer();
    }
    private void initSurfaceView(){
        SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
        surfaceView.getHolder().addCallback(this);
    }
    private void initPlayer(){
        IjkMediaPlayer.loadLibrariesOnce(null);
        IjkMediaPlayer.native_profileBegin("libijkplayer.so");
        mPlayer = new IjkMediaPlayer();
        try {
            String path = Environment.getExternalStorageDirectory().getPath() + "/20180730.mp4";
            mPlayer.setDataSource(path);

        } catch (IOException e) {
            e.printStackTrace();
        }
        mPlayer.prepareAsync();
        mPlayer.start();
    }
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        //将所播放的视频图像输出到指定的SurfaceView组件
        mPlayer.setDisplay(surfaceHolder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

    }
}

5、布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>

这里直接使用SurfaceView进行播放视频,如果要使用ijkVideoView控件,请参考官方demo进行移植。

更多流媒体资讯,请关注小牛安卓干货铺,将进行不定期推送。ijkplayer-android编译与使用说明