Android IjkPlayer各状态解析
1.ijkPlayer状态图
2.各个状态的含义
3.状态的详细解析
IDLE状态:空闲/闲置状态,这个状态有两种触发的方式:
1. 我们在new一个新的播放器private IjkMediaPlayer mediaPlayer = new IjkMediaPlayer(); 创建之后这个mediaPlayer就处于IDLE状态
2.除了END状态以外,在其他状态调用reset()方法,可以让mediaPlayer转为IDLE状态。
此状态可转变为:
1.调用setDataSource()方法转化为INITIALIZED状态。
2.调用release()方法转化为END状态。
INITIALIZED状态:初始化状态
当mediaPlayer处于IDLE状态时,调用setDataSource()方法可以转变为INITIALIZED状态
此状态可转变为:
1.调用prepareAsync()方法转化为ASYNC_PREPARING状态。
2.调用reset()方法转化为IDEL状态。
3.调用release()方法转化为END状态。
ASYNC_PREPARING状态:准备中,比如通过网络播放一个音频地址,
INITIALIZED状态下调用prepareAsync()方法。
STOPPED状态下调用prepareAsync()方法。
此状态可转变为:
流成功开启后转化为PREPARED状态。
调用reset()方法转化为IDEL状态。
调用release()方法转化为END状态。
出现错误转化为ERROR状态。
PREPARED状态:准备工作完成。
ASYNC_PREPARING状态下成功开启流。
此状态可转变为:
调用start()方法转化为STARTED状态,上面表格里看到的音频正在播放的状态.
调用reset()方法转化为IDEL状态。
调用release()方法转化为END状态。
STARTED状态:正在播放状态
PREPARED状态下调用start()方法。
PAUSED状态下调用start()方法。
COMPLETED状态下调用start()方法。
可以转换的状态:
调用pause()方法转化为PAUSED状态。
调用stop()方法转化为STOPPED状态。
流正常中止后转化为COMPLETED状态。
调用reset()方法转化为IDEL状态。
调用release()方法转化为END状态。
出现错误转化为ERROR状态。
PAUSED:暂停状态
STARTED状态下调用pause()方法。
可以转换的状态:
调用start()方法转化为STARTED状态。
调用stop()方法转化为STOPPED状态。
调用reset()方法转化为IDEL状态。
调用release()方法转化为END状态
COMPLETED:工作正常完成状态,(正常播放完整首音频)
可以转换的状态:
调用start()方法转化为STARTED状态。
调用stop()方法转化为STOPPED状态。
调用reset()方法转化为IDEL状态。
调用release()方法转化为END状态。
STOPPED:停止状态
STARTED状态下调用stop()方法。
PAUSED状态下调用stop()方法。
COMPLETED状态下调用stop()方法。
可以转换的状态:
调用prepareAsync()方法转化为ASYNC_PREPARING状态。
调用reset()方法转化为IDEL状态。
调用release()方法转化为END状态
ERROR:出现播放错误状态
转化条件
调用prepareAsync()方法时出错。
调用start()方法时出错。
可转化为
调用reset()方法转化为IDEL状态。
调用release()方法转化为END状态。
END:最终状态,不可逆。
转化条件
任意状态下调用release()方法。
可转化为
不可转化,此状态下的MediaPlayer不能再使用,必须重新创建
学习这些状态的作用在于能清晰认识到播放器播放过程中的状态,避免出现一些异常的发生。
比如:我们要实现一个音乐播放器,涉及到 暂停/播放,上一首,下一首,停止。
默认我们的音乐播放列表里面有10首歌曲,我们一开始点击播放,正常从列表中position为0的位置开始播放,这时候我们的mediaPlayer就处于started状态,然后我们要想切换一首歌曲,点击了下一首,如果你没有对状态有个清晰的认识,直接mediaPlayer.setDataSource(url), url是position为1的那条音频url地址。那么就相当于与咱们直接从started状态到INITIALIZED状态:初始化状态.这时候就会发现代码里面其实已经抛出了异常。那么我们了解状态之后,知道当前的started状态,我们可以通过reset()方法,先让其回到空闲状态,然后再去设置mediaPlayer.setDataSource(url),变成INITIALIZED,然后prepareAsync();监听到prepared的时候,调用start()方法进行播放。
当然了,上面的都是些基础的概念与使用,可以帮助我们理解播放器播放的过程。关于音频播放里面有很多的复杂的东西,今天暂时写到这里了
参考文献:https://blog.csdn.net/a910626/article/details/98893836
https://blog.csdn.net/weixin_52622200/article/details/114880502