前言
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个方法:(当然可以先不关注,下面依然会重新提到它们)
- 给MediaPlayer添加预览的SurfaceHolder.
- 添加播放视频的路径与配置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