您的位置:首页 > 移动开发 > Android开发

Android播放器开发基础(二)

2017-09-12 11:44 246 查看

Android播放器开发基础(二)

1. 播发器示例

2. 播放器开发小技巧

播发器示例

在VideoView中有开启播放视频的代码修改后如下:

注意 :MediaPlayer中没有提供当前播放位置的回调,要主动使用:getCurrentPosition()来获取;

播放器状态:从Idle状态到init状态再到prepare或者preparing状态

/**
* 开启视频播放
*
**/
public void openVideo() {
try {
mMediaPlayer = new MediaPlayer();// new
// 执行了异步准备prepareAsync()以后的回调监听
mMediaPlayer.setOnPreparedListener(mPreparedListener);
mIsPrepared = false;
// video size is first known or updated 视频内容尺寸的变化回调,在第一载入和内容变化时回调
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
// 视频播放完毕时的回调
mMediaPlayer.setOnCompletionListener(mCompletionListener);
// 播放出错时的回调
mMediaPlayer.setOnErrorListener(mErrorListener);
// 网络播放时的视频缓存更新时的回调
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
// 播放时的状态(主要是 是否处于缓冲状态或缓冲结束状态 MEDIA_INFO_BUFFERING_START)
// 注意:MediaPlayer中没有提供当前播放位置的回调,要主动使用:getCurrentPosition()来获取;
mMediaPlayer.setOnInfoListener(mInfoListener);
// 设置定位完成的监听
mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener);
if (mUri != null) {
// 处于数据源处于init状态
mMediaPlayer.setDataSource(mUri.toString());
mCurrState = INITIALIZED;
mNextState = PREPARING;
}
// 设置显示的位置
mMediaPlayer.setDisplay(mSurfaceHolder);
// 屏幕常亮
mMediaPlayer.setScreenOnWhilePlaying(true);
// 异步准备(处于准备中的状态)
mMediaPlayer.prepareAsync();
mCurrState = PREPARING;
attachMediaController();
} catch (IOException ex) {
LogUtil.e(TAG, "Unable to open content: " + mUri + ex.getMessage());
mErrorListener.onError(mMediaPlayer, -1, 0);
return;
} catch (IllegalArgumentException ex) {
LogUtil.e(TAG, "Unable to open content: " + mUri + ex.getMessage());
mErrorListener.onError(mMediaPlayer, -1, 0);
return;
}
}


显示的SurfaceView的切换

需要快速从小屏幕状态切换的全屏状态则可以使用这样的方式快速切换,也不需要重新创建SurfaceView以及MediaPlayer,只是切换了显示位置

//使用同一个MediaPlayer,通过setDisplayer更换Surface显示位置
mediaPlayer.pause();
mediaPlayer.setDisplay(big_surface_view.getHolder());
mediaPlayer.start();


播放器开发小技巧

MediaPlayer中有些操作是耗时操作,有时会时间很长,甚至会出现ANR的现象

例如:

setDataSource()
prepare()
release()
reset()
所以在做这些操作的时候需要进行异步操作,防止ARN


总结:

做播放器开发需要注意MediaPlayer的状态,大部分的播放问题是使用的当前状态下非法的操作造成的,同时播放器自身的耗时操作也会造成卡顿,需要结合业务逻辑处理。Android原生的MediaPlayer播放器在不同机器上的表现也不同,机器的硬件也会影响到视频的播放,部分机器不能很好的支持高码率的视频源,所以在视频源的选择中也需要尽量兼容到机器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android mediaplayer 视频