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);
        }
    }
}

后面会使用编译出来的解码器和渲染器等写一些音视频相关的页面。

项目地址

发布了30 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y331271939/article/details/83476998