前言
MediaPlayer,可以播放视频/音频,并且它支持本地和网络文件的播放.本片博客作为入门教程,先以最通俗的方式解释播放文件本地视频.
实现流程
获取权限
保持屏幕常亮
初始化SurfaceView的状态监听
初始化MediaPlayer
给MediaPlayer添加预览SurfaceView的SurfaceHolder
添加需要播放的视频并且配置MediaPlayer
播放视频
暂停视频
停止视频
释放内存
获取权限
播放本地视频,那就需要读写存储权限,注意别忘记了动态授权
保持屏幕常亮
音视频开发的基本操作,在xml的根布局上添加下面这个属性,也可以在SurfaceView上添加
android:keepScreenOn="true"
初始化SurfaceView
作为显示播放视频的曲面View,如果你还不了解它.那么建议你先学习一些SurfaceView的知识.
我们需要监听SurfaceView状态,确定它启动完毕之后我们在开始加载播放视频.在onCreate执行下面的初始化initSurfaceviewStateListener
private voidinitSurfaceviewStateListener() {
mSurfaceHolder=mVideoPlaySurfaceview.getHolder();
mSurfaceHolder.addCallback(newSurfaceHolder.Callback() {
@Overridepublic voidsurfaceCreated(SurfaceHolder holder) {
mMediaPlayer.setDisplay(holder);//给mMediaPlayer添加预览的SurfaceHolder
setPlayVideo(mPath);//添加播放视频的路径
}
@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, intheight) {
Log.e(TAG,"surfaceChanged触发: width=" + width + "height" +height);
}
@Overridepublic voidsurfaceDestroyed(SurfaceHolder holder) {
}
});
}
在surfaceCreated方法里执行了2个方法:(当然可以先不关注,下面依然会重新提到它们)
给MediaPlayer添加预览的SurfaceHolder.
添加播放视频的路径与配置MediaPlayer
初始化MediaPlayer
private voidinitMediaPalyer() {
mMediaPlayer= newMediaPlayer();
}
直接new,没说明好说的,也是可以先在onCreate执行initMediaPalyer
给MediaPlayer添加预览SurfaceView的SurfaceHolder
SurfaceView初始化完成后直接给MediaPlayer设置SurfaceHolder >>>>> mMediaPlayer.setDisplay(holder);
mSurfaceHolder.addCallback(newSurfaceHolder.Callback() {
@Overridepublic voidsurfaceCreated(SurfaceHolder holder) {
mMediaPlayer.setDisplay(holder);//给mMediaPlayer添加预览的SurfaceHolder
setPlayVideo(mPath);//添加播放视频的路径
}
添加需要播放的视频并且配置MediaPlayer
private voidsetPlayVideo(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() { //准备完成回调
@Overridepublic voidonPrepared(MediaPlayer mp) {mp.start();//启动播放视频
}
});
}catch(IOException e) {
e.printStackTrace();
}
}
setPlayVideo方法,在surfaceCreated接口回调方法里执行即可.上面已经有写就不在重复交代了
播放视频
private voidstartPlay(){if (!mMediaPlayer.isPlaying()){ //判断视频是否在播放
mMediaPlayer.start();
}
}
暂停视频
private voidpausePlay(){if(mMediaPlayer.isPlaying()){
mMediaPlayer.pause();
}
}
停止视频
private voidstopPlay(){if(mMediaPlayer.isPlaying()){
mMediaPlayer.stop();
}
}
释放内存
这是必要的,因为MediaPlayer底层是运行C++的函数方法.不要使用后,必需释放内存
@Overrideprotected voidonDestroy() {super.onDestroy();if (mMediaPlayer != null){if(mMediaPlayer.isPlaying()){
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer= null;
}
}
end