ijkplayer 编译精简
上篇文章说了一下我编译ijkplayer的过程,没看过的可以大体看一下,ijkplayer编译,下面会把编译出来的Demo(ijkplayer-example)中的有用的拷出来。
1、导入基础库
新建一个空的Android项目,然后将ijkplayer-java和ijkplayer-exo分别导入到项目
File-New-Import Module
导入到项目里ijkplayer-java和ijkplayer-exo的gradle分别是下面这样
将这两个module的gradle改一下,最好改为和自己app的gradle一样,这样比较省事,下面为我改后的
然后在settings.gradle中添加":ijkplayer-java"和":ijkplayer-exo"
ijkplayer-java和ijkplayer-exo在导入时自己没改默认的Module name就是":ijkplayer-java"和":ijkplayer-exo"
不知道叫啥可以看刚导入的module下有个ijkplayer-java.iml文件,里面第二行external.linked.project.id里应该就是
最后在app的build.gradle文件里引用一下,Sync一下应该就没错了
dependencies {
...
implementation project(':ijkplayer-java')
implementation project(':ijkplayer-exo')
}
如果不需要IjkExoMediaPlayer可以不导入ijkplayer-exo,并将后面添加的IjkVideoView中引用删掉即可。
2、导入so包
ijkplayer-example会将so库以module的形式引入的,下面把他拷出来,在app的main下新建jniLibs,然后分别将ijkplayer-arm64、ijkplayer-armv5、ijkplayer-armv7a、ijkplayer-x86、ijkplayer-x86_64 module下src\main\libs下的文件夹拷到jniLibs下即可。
到了这一步就可以使用ijkplayer提供的解码器了,ijkplayer-java里提供的IjkMediaPlayer和对MediaPlayer封装的AndroidMediaPlayer还有ijkplayer-exo里提供的IjkExoMediaPlayer都可以正常使用了,测试一下,我这里没有音频地址,没关系正好有个视频地址测一下,下面https地址可以正常播放声音的
public class AudioTestActivity extends AppCompatActivity {
private AbstractMediaPlayer mPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_audio_test);
}
public void handlePlayAudio(View view) {
// createIjkPlayer();
createExoPlayer();
// createMediaPlayer();
}
@Override
protected void onDestroy() {
super.onDestroy();
release();
}
private void createIjkPlayer() {
mPlayer = new IjkMediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mPlayer.setDataSource("https://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
} catch (IOException e) {
e.printStackTrace();
}
mPlayer.prepareAsync();
}
private void createExoPlayer() {
mPlayer = new IjkExoMediaPlayer(this);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mPlayer.setDataSource("https://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
} catch (IOException e) {
e.printStackTrace();
}
mPlayer.prepareAsync();
mPlayer.start();
}
private void createMediaPlayer() {
mPlayer = new AndroidMediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mPlayer.setDataSource("https://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
} catch (IOException e) {
e.printStackTrace();
}
mPlayer.prepareAsync();
mPlayer.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(IMediaPlayer mp) {
mPlayer.start();
}
});
}
private void release() {
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
}
}
3、其他资源导入
ijkplayer-example中还提供了一个视频播放器IjkVideoView,功能类似于VideoView,可以选择解码器和渲染器等,非常好用。
将widget\media包下的类(InfoHudViewHolder和TableLayoutBinder是弹窗的我删除了)和MediaPlayerService.java类拷贝到项目里,然后将strings_pref.xml文件也拷进来。然后我对IjkVideoView类里面做了一下修改,将之前的Settings设置选项改为新建了一个PlayerConfig类,里面维护的SharedPreferences用于动态设置一些选项,功能和之前一样。具体可以看下我提到github的代码。
然后就可以播放视频了
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".test.VideoTestActivity">
<com.bill.ijkplayerproject_2.ijk.widget.media.IjkVideoView
android:id="@+id/ijk_video_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
public class VideoTestActivity extends AppCompatActivity {
private IjkVideoView mVideoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_test);
mVideoView = findViewById(R.id.ijk_video_view);
IjkMediaPlayer.loadLibrariesOnce(null);
IjkMediaPlayer.native_profileBegin("libijkplayer.so");
mVideoView.setVideoPath("https://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
mVideoView.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mVideoView != null) {
mVideoView.stopPlayback();
mVideoView.release(true);
}
}
}