ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-06-13 21:41:08  阅读:216  来源: 互联网

标签:mMediaPlayer 视频 入门 MediaPlayer void SurfaceHolder Android 播放


前言

  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

标签:mMediaPlayer,视频,入门,MediaPlayer,void,SurfaceHolder,Android,播放
来源: https://www.cnblogs.com/guanxinjing/p/11019662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有