Android开发 MediaPlayer入门_播放本地视频

前言

  MediaPlayer,可以播放视频/音频,并且它支持本地和网络文件的播放.本片博客作为入门教程,先以最通俗的方式解释播放文件本地视频.

 

实现流程

  •   获取权限
  •   保持屏幕常亮
  •   初始化SurfaceView的状态监听
  •   初始化MediaPlayer
  •   给MediaPlayer添加预览SurfaceView的SurfaceHolder
  •   添加需要播放的视频并且配置MediaPlayer
  •   播放视频
  •   暂停视频
  •   停止视频
  •   释放内存

 

获取权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

播放本地视频,那就需要读写存储权限,注意别忘记了动态授权

保持屏幕常亮

音视频开发的基本操作,在xml的根布局上添加下面这个属性,也可以在SurfaceView上添加

android:keepScreenOn="true"

初始化SurfaceView

作为显示播放视频的曲面View,如果你还不了解它.那么建议你先学习一些SurfaceView的知识.

我们需要监听SurfaceView状态,确定它启动完毕之后我们在开始加载播放视频.在onCreate执行下面的初始化initSurfaceviewStateListener

private void initSurfaceviewStateListener() {
        mSurfaceHolder = mVideoPlaySurfaceview.getHolder();
        mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                mMediaPlayer.setDisplay(holder);//给mMediaPlayer添加预览的SurfaceHolder
                setPlayVideo(mPath);//添加播放视频的路径
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                Log.e(TAG, "surfaceChanged触发: width=" + width + "height" + height);

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });
    }

在surfaceCreated方法里执行了2个方法:(当然可以先不关注,下面依然会重新提到它们)

  1. 给MediaPlayer添加预览的SurfaceHolder.
  2. 添加播放视频的路径与配置MediaPlayer

初始化MediaPlayer

 

private void initMediaPalyer() {
        mMediaPlayer = new MediaPlayer();

    }

 

直接new,没说明好说的,也是可以先在onCreate执行initMediaPalyer

 

给MediaPlayer添加预览SurfaceView的SurfaceHolder

 

SurfaceView初始化完成后直接给MediaPlayer设置SurfaceHolder >>>>> mMediaPlayer.setDisplay(holder);

 

 

mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                mMediaPlayer.setDisplay(holder);//给mMediaPlayer添加预览的SurfaceHolder
                setPlayVideo(mPath);//添加播放视频的路径
            }

 

添加需要播放的视频并且配置MediaPlayer

 

 

    private void setPlayVideo(String path) {
        try {
            mMediaPlayer.setDataSource(path);//设置播放视频文件
            mMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);//缩放模式
            mMediaPlayer.setLooping(true);//设置循环播放
            mMediaPlayer.prepareAsync();//异步准备
//            mMediaPlayer.prepare();//同步准备,因为是同步在一些性能较差的设备上会导致UI卡顿
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { //准备完成回调
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();//启动播放视频
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

setPlayVideo方法,在surfaceCreated接口回调方法里执行即可.上面已经有写就不在重复交代了

播放视频

 

private void startPlay(){
        if (!mMediaPlayer.isPlaying()){ //判断视频是否在播放
            mMediaPlayer.start();
        }
    }

暂停视频

 

 

 private void pausePlay(){
        if (mMediaPlayer.isPlaying()){
            mMediaPlayer.pause();
        }
    }

 

停止视频

 

 

private void stopPlay(){
        if (mMediaPlayer.isPlaying()){
            mMediaPlayer.stop();
        }
    }

 

释放内存

这是必要的,因为MediaPlayer底层是运行C++的函数方法.不要使用后,必需释放内存

 

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null){
            if (mMediaPlayer.isPlaying()){
                mMediaPlayer.stop();
            }
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

上一篇:java – SurfaceView示例


下一篇:Android进阶:自定义视频播放器开发(上)