ijkplayer 使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/y331271939/article/details/83217507

下面简单介绍一下ijkplayer的使用

ijkplayer是b站基于FFmpeg开源的播放器,ijkplayer提供了个IjkMediaPlayer,功能和用法跟MediaPlayer类似,但是强大很多

官网Github

一、ijkplayer使用

1、新建一个Android项目,并在app的gradle下的dependencies中添加下面代码,其中ijkplayer-java是核心代码必须添加,IjkMediaPlayer就在这里面。ijkplayer-armv7a是armeabi-v7a下的so库,ijkplayer-armv5是armeabi下的so库,ijkplayer-arm64是arm64-v8a下的so库,ijkplayer-x86是x86下的so库,ijkplayer-x86_64是x86_64下的so库,根据项目选择添加即可,一般一套armeabi-v7a就可以了。ijkplayer-exo是谷歌下的IjkExoMediaPlayer,如果需要使用的话可以添加。
    # required, enough for most devices.
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'

    # Other ABIs: optional
    compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'

    # ExoPlayer as IMediaPlayer: optional, experimental
    compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'

2、在AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
3、使用SurfaceView播放视频
<SurfaceView
    android:id="@+id/surface_view"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

public class MainActivity extends AppCompatActivity {

    private SurfaceView surfaceView;
    private IjkMediaPlayer mPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        surfaceView = findViewById(R.id.surface_view);
        surfaceView.getHolder().addCallback(callback);
    }

    private void createPlayer() {
        if (mPlayer == null) {
            mPlayer = new IjkMediaPlayer();
            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                mPlayer.setDataSource("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
            } catch (IOException e) {
                e.printStackTrace();
            }
            mPlayer.prepareAsync();
        }
    }

    private void release() {
        if (mPlayer != null) {
            mPlayer.stop();
            mPlayer.release();
            mPlayer = null;
        }
        IjkMediaPlayer.native_profileEnd();
    }

    private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            createPlayer();
            mPlayer.setDisplay(surfaceView.getHolder());
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (surfaceView != null) {
                surfaceView.getHolder().removeCallback(callback);
                surfaceView = null;
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        release();
    }

}
4、使用TextureView播放视频
<TextureView
    android:id="@+id/texture_view"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

public class MainActivity extends AppCompatActivity {

    private TextureView textureView;
    private Surface mSurface;

    private IjkMediaPlayer mPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textureView = findViewById(R.id.texture_view);
        textureView.setSurfaceTextureListener(listener);

    }

    private void createPlayer() {
        if (mPlayer == null) {
            mPlayer = new IjkMediaPlayer();
            mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                mPlayer.setDataSource("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
            } catch (IOException e) {
                e.printStackTrace();
            }
            mPlayer.prepareAsync();
        }
    }

    private void release() {
        if (mPlayer != null) {
            mPlayer.stop();
            mPlayer.release();
            mPlayer = null;
        }
        IjkMediaPlayer.native_profileEnd();
    }

    private TextureView.SurfaceTextureListener listener = new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
            createPlayer();
            mSurface = new Surface(surface);
            mPlayer.setSurface(mSurface);
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            textureView.setSurfaceTextureListener(null);
            textureView = null;
            mSurface = null;
            return true;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surface) {

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        release();
    }

}

二、其他设置

// 设置倍速,MediaPlayer是不支持的
mPlayer.setSpeed(1.0f);

// 设置不自动播放(ijkPlayer默认准备就自动播放)
mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);

// 设置编码方式 1:硬编码 0:软编码
mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);

...

// 一些监听
setOnPreparedListener
setOnCompletionListener
setOnErrorListener

上面为IjkMediaPlayer的基本设置,其他具体根据项目要求再设置,不过使用上面用法不支持https,可以把上面视频地址改为https的,上面地址支持https的,可以在浏览器中测试,在Demo里就播不了,报下面错误。因为上面Bilibili上面提供的用法不支持https,想要支持的话需要自己编译,下篇文章将介绍自己编译ijkplayer。

10-20 21:52:46.499 5927-6130/com.bill.ijkplayerproject W/IJKMEDIA: https protocol not found, recompile FFmpeg with openssl, gnutls or securetransport enabled.
10-20 21:52:46.499 5927-5927/com.bill.ijkplayerproject D/IJKMEDIA: ffpipeline_set_surface()
10-20 21:52:46.499 5927-5927/com.bill.ijkplayerproject D/IJKMEDIA: ijkmp_set_android_surface(surface=0xffe97ed0)=void
10-20 21:52:46.499 5927-6130/com.bill.ijkplayerproject E/IJKMEDIA: https://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4: Protocol not found
、

项目地址

猜你喜欢

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