Android视频播放器开发—— 探究MediaPlayer

概述

之前在公司都是做金融和博彩相关的app,很少接触到视频播放类的应用开发,趁最近比较闲,想逐步学习相关的知识,给自己增加点视频类app开发的经验,也希望读者能够从我个人的学习当中得到一些启发。

一、学习MediaPlayer的API

对于我来讲,学习新东西第一步就是看相关的api,于是我找到了Android中最基本的MediaPlayer的开发文档进行简单的学习。

这里写图片描述
从图我们可以看出,MediaPlayer是个单独的子类,继承Object,说明他就是最基本的实现类,学习起来就相对容易。

紧接着,api中列出了MediaPlayer的运作周期的状态图,如下图所示:

这里写图片描述

其中,蓝色椭圆内是代表MediaPlayer的某个周期状态,单箭头表示同步,双箭头表示异步,弧形表示程序执行期间的调用,或者说在某个类执行期间调用某些方法。

从上图中我们能看到MediaPlayer类中有以下一些状态:

  • Idle

    • 当一个MediaPlayer类通过new实例化或者执行了reset()方法之后,就会进入到Idle状态。

    • API中提到,如果在Idle状态下调用诸如 getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int), setLooping(boolean), setVolume(float, float), pause(), start(), stop(), seekTo(int), prepare() or prepareAsync()等等获取媒体文件属性等方法时,会报错,并回调OnErrorListener.OnError()方法。

  • End

    • 当状态在Idle时,若调用release()方法后,状态将变为End结束。

    • 该状态会释放一切播放器所持有的资源,结束所有回调和引用的实例,进入此状态后,将不能回到其他的状态中去。

  • Error

    • 如果在MediaPlayer刚被构建出来的时候,就调用获取媒体文件属性等方法时,播放器内部将不会执行用户所构造出来的类似OnErrorListener.onError()这类回调,并且状态也不会变为Error。但是如果用户是在reset()方法执行之后再调用那些方法时,就会回调监听方法,并且状态变为Error。

    • 一旦播放器在播放过程中发生错误,即使开发者没有注册相关错误回调方法,播放器也会变成Error状态。
      若在Error中调用reset()方法,将会回到Idle状态。

    • API也建议我们注册一个错误监听器能更有效的监听播放器在运行过程中的错误状态原因,并随时修正我们的代码。

  • Initialized

    • 当调用setDateSource()方法后,播放器当前状态将从Idle装变为Initialized

    • 如果setDateSource()在其他状态下被调用,将会报错

  • Prepared

  • Preparing

    • 如果我们要播放某个媒体文件,在播放器进入Started状态之前,需要在Initialized状态调用prepare()方法让播放器进入Prepared(准备)状态。

    • 有两种方式(同步/异步)可以到达Prepared状态。一种是直接执行prepare()方法,当方法返回后,就将进入Prepared状态,也称之为同步的方法。如果是异步的方法,可以调用prepareAsync()方法让播放引擎进入准备中的状态。当准备完成或prepare()方法返回后,播放引擎就会回调开发者所注册的回调接口setOnPreparedListener()。

    • 需要注意的是,Preparing的状态是一个过渡状态,改状态的时候,一些回调方法将会出现不会执行的情况

    • 在Prepared状态时,可以设置一些播放器配置方法。

  • Started

    • 在执行start()方法后,播放器进入started状态,该状态时,播放器将会开始播放,isPlaying()方法将会调用,也会告诉你是否已经在Started状态中。

    • 如果开发者注册了setOnBufferingUpdateListener(OnBufferingUpdateListener)监听,那么在这个状态时成功后,会回调该监听。该接口可以监听媒体流的状态。

  • Stopped

  • Paused

    • 当调用stop()方法或者pause()方法后,相应的,播放器将会进入Stopped和Paused状态。注意的是,这个转变状态的过程是异步过程,所以在改变状态的时候不是立即转变,而是需要一定时间的延时。

    • 如果播放引擎处于Paused状态,这时调用start()方法,播放引擎将会重新回到started状态,并开始从暂停出开始播放。

    • 如果调用stop()方法,那么如果播放器处于Started, Paused, Prepared or PlaybackCompleted 状态时,都将转化成Stopped状态,并且播放器将不能继续播放,除非让播放器重新回到Prepared状态后,才能开启播放。

  • PlaybackCompl

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值