经过一番折腾与踩坑,终于在Ubuntu成功编译了ijkplayer源码,并成功在自己的demo调用ijkplayer库实现视频播放。在此对之前的编译及demo调用进行总结。
Ubuntu版本为18.04LTS。根据官网介绍,在编译之前需要先做一些环境配置准备。
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版本太低。
上面如果编译成功了,会生成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这个目录的架构。
1、新建工程,将你需要的平台so库拷贝到libs目录下。
2、再将编译后的ijkplayr工程目录下的ijkplayer-java/build/outputs/arr/ijkplayer-java-release.arr也复制到新建工程文件的libs目录下。
3、 修改新建工程app模块下的build.gradle文件
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、布局文件:
这里直接使用SurfaceView进行播放视频,如果要使用ijkVideoView控件,请参考官方demo进行移植。