android视频播放主要是两种方式1、系统封装好的videoplayer,有前进、后退、暂停/播放、拉动最基本的功能,够一般使用,操作办法也很简单,如果需要自定义程度高就需要用到第二种方法:SurfaceView+mediaplayer,显示通过surfaceView,使mediaplayer和surfaceview绑定

SurfaceView+mediaplayer,主要操作办法:1、监听surfaceview回调函数,等待surfaceview初始化完毕

surface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surface.getHolder().addCallback(new Callback() {// surface初始化的回调// 发生改变public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}// 创建完成public void surfaceCreated(SurfaceHolder holder) {Log.e("media", "surfaceView创建完成!");preMediaplayer();}// 销毁public void surfaceDestroyed(SurfaceHolder holder) {}});

2、初始化完毕后就可以对mediaplayer进行操作了,需要了解mediaplayer的生命周期图

android视频播放心得体会


if (SinoAppliacation.mediaPlayer == null) {SinoAppliacation.mediaPlayer = new MediaPlayer();}try {SinoAppliacation.mediaPlayer.reset();SinoAppliacation.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);SinoAppliacation.mediaPlayer.setDisplay(surface.getHolder());SinoAppliacation.mediaPlayer.setDataSource(url);SinoAppliacation.mediaPlayer.setLooping(true);SinoAppliacation.mediaPlayer.prepareAsync();

几项最基本的初始化操作,包括设置声音、和surfaceview绑定、设置播放地址、循环播放,异步准备。

在做几项最基本的监听:

SinoAppliacation.mediaPlayer.setOnInfoListener(new OnInfoListener() {// 等待缓冲监听@Overridepublic boolean onInfo(MediaPlayer mp, int what, int extra) {switch (what) {case MediaPlayer.MEDIA_INFO_BUFFERING_START:loading.setVisibility(View.VISIBLE);break;case MediaPlayer.MEDIA_INFO_BUFFERING_END:// 缓存完成,继续播放loading.setVisibility(View.INVISIBLE);break;}return true;}});SinoAppliacation.mediaPlayer.setOnErrorListener(new OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {mCurrentState = STATE_ERROR;Log.e("mediaplay", "error");Toast.makeText(BaseVideoPlayActivity.this, "亲,视频出错了!", 0).show();return false;}});SinoAppliacation.mediaPlayer.setOnPreparedListener(new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {initTimeAndBar();SinoAppliacation.mediaPlayer.start();}});} catch (Exception e) {Log.e("media", e + "");}


这里做了三项监听,当然还有其他监听这里不需要了。第一个是等待缓冲监听,当滑动进度条后还没有及时加载需要显示个progressbar就可以在这里设置。第二个是错误监听,当视频播放出错可以给用户提示。第三项是最重要的,当onPrepared时才是mediaplayer准备完毕可以进行播放了,通过调用start()方法执行播放。通过Pause()暂停。

基本就这些

做的过程中遇到的问题及解决办法:

1、加载时的监听。有两种方式,一个是加载的进度占总进度的比例,一般可以用两个进度条去做加载状态,可以 通过mediaplayer的mediaPlayer.setOnBufferingUpdateListener来监听。如果是拖动还未加载出当前视频,可以通过setOnInfoListener来监听。

2、竖屏切换横屏。有很多人提出这样的需求,但是貌似没有很好的解决办法,android貌似也没有ios那种无缝的一个页面切换的办法。我这里的解决办法是在application里存放一个静态的mediaplayer

public static MediaPlayer mediaPlayer;//视频播放静态类

竖屏和横屏是两个activity,但是切换时只是对静态mediaplayer执行pause,在获取到当前播放位置传递给第二个activity,在执行start播放

3、在切换页面时,直接给静态的mediaplayer调用start方法时会报错,或者从头播放。原因有两个,一、没判断surfaceview是否加载成功,重新进入activity也需要对surfaceview的准备状态进行监听,当执行surfaceCreated创建完成时才可继续操作。二、没有把surfaceview和mediaplayer重新绑定,必须执行setDisplay(surface.getHolder());后再去执行start才能正常播放!


更多相关文章

  1. android6.0源码分析之Runtime的初始化
  2. Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shade
  3. Android Launcher7.0首次数据加载逻辑
  4. Android Mediaplayer error (1, -2147483648) Error (-38,0)解决
  5. android Webview加载url空白,但浏览器能打开
  6. android WebView, WebChromeClient和WebViewClient加载网页基本
  7. 流媒体开发之-服务器图片的加载
  8. 有关android中加载MP4,3gp等视频文件,无法播放问题的解决

随机推荐

  1. 【Android 设计】:样式_ 触感 | 度量与网
  2. chez scheme for android 移植完成
  3. Android偷偷进了PC村,Google是无心插柳还
  4. Android(安卓)Scripting Environment
  5. android开发 - 圆角和边框
  6. [Android]使用ActivityGroup来切换Activi
  7. Android 操作串口 (android serial port
  8. 屏蔽电信流氓广告造成的诡异的问题--Andr
  9. 当遇到百度和谷歌都不知道的技术问题时改
  10. android 中处理崩溃异常并重启程序