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开发之播放器中涉及的Surface,SurfaceView,SurfaceHolder基础
- Android播放器开发基础(一)
- Android Map开发基础知识学习笔记
- Android 开发文档 程序基础 ——activity组件
- Android 开发文档 程序基础 ——Content providers组件
- Android 开发文档 程序基础 ——Services组件
- Android开发指南-框架主题-基础知识
- Android 开发文档 程序基础——Intent filters
- Android UI开发专题(二) 之绘图基础
- Android 开发文档 程序基础——Affinities and new tasks
- Android开发基础:创建菜单Menu
- Android开发指南-框架主题-基础知识
- 转载:Android开发基础:如何创建启动界面Splash Screen
- Android 开发文档 程序基础——Activating components: intents
- Android 开发文档 之程序基础Application Fundamentals
- Android开发之旅:应用程序基础及组件(续)
- Android开发指南-框架主题-基础知识
- Android开发之旅:应用程序基础及组件
- Android 开发文档 程序基础——Activities and Tasks
- Android UI开发专题(二) 之绘图基础