Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

时间:2024-03-30 07:01:04

本文转自: Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

前言:
从本篇开始,将进入Multimedia框架,包含MediaPlayer, Camera, Surface, MediaRecord, 接下来几篇都是MediaPlayer相关。

同样看下Agenda如下:
(1):MediaPlayer的状态图
(2):Idle 状态
(3):End 状态
(4):Error 状态
(5):Initialized状态
(6):Prepared状态
(7):Preparing状态
(8):Started状态
(9):Paused状态
(10):Stopped状态
(11):PlaybackCompleted状态


MediaPlayer介绍

MediaPlayer类是用于控制playback的视频/音频文件 及 流。
主要覆盖如下以下方面:
(1) 状态图
(2) 有效状态及无效状态
(3) 权限
(4) 回调方法

MediaPlayer的状态图

playback控制视频/音频文件及流是被状态机进行管理。
下图显示MediaPlayer生命周期以及由playback控制操作所影响。
Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期
椭圆代表MediaPlayer驻留的状态
弧代表playback控制且驱动MediaPlayer状态进行过渡。
有两种类型的弧,一种是用单箭头表示的是同步方法调用,另一种有两个箭头代表异步方法调用

从状态图中,我们能看到MediaPlayer有如下一些状态:

Idle 状态及End 状态

当MediaPlayer 用 new 或者在 reset 方法调用后,就被创建了, 这个时候它是处于Idle (就绪)状态,
当 releasel 方法被调用后,它就属于 End(结束状态),
这两种下状态之间,就是 MediaPlayer的生命周期。

Error 状态

  1. 有一种微妙的 但 又非常重要的时刻
    当构造 一个新的 MediaPlayer 或者 reset() 方法被调和后。
    在这两种情况下,应用程序调用getCurrentPosition,getVideoHeight(),getDuration(),getVideoWidth(),setAudioStramType(int),
    setLooping(boolem),setVolume(float, float),pause(),start(), stop(), seekTo(int), prepare(), prepareAsync(),
    这些方法在Idle(就绪状态) 时有可能出错。

    如果这些方法在MediaPlayer 被构造后,调用正确的话,用户提供回调函数方法 OnErrorListener.onError() 将不会调用在player内部,
    MediaPlayer的状态也不会变化,

    但是这些方法如果是在reset 方法如果是在reset 方法调用后,再调用时,用户提供的回调方法OnErrorListener.onError() 将传递MediaPlayer 到 Error (错误)的状态,
    所以,也推荐一旦MediaPlayer 不再使用时,马上调用下release 方法, 以便 MediaPlayer 资源得到释放, 这些资源也许包含一些单例。
    如硬的加速组件和失败去调用release 也许引起后续 MediaPlayer 实例回退到软件非播放页或退出。

  2. 一旦MediaPlayer 是End 结束状时,它将不再能被使用,没有任何办法带它回到MediaPlayer的其它状态。
    生命周期已经终止。
    进一步说,当MediaPlay 使用NEW 创建后,变成Idle 就绪状态时,同时这些创建 重载创建create 方法,不是Idle 就绪状态。
    事实上,如果创建时使用create 方法成功的话,这些已经是Prepared(准备好)状态。

  3. 总的来说,一些Playback 的控制操件也许会失败,由于各种原因,如不支持的音频格式,糟糕的音视频交错,分辨率过高,流超时,等等。
    因此,在这种情况下,错误报告并覆盖相关问题是非常重要的。 有时,由于程序错误,调用playback 控制操作也许会变得无效。
    在这种错误的条件下,如果事先,用户通过setOnErrorListener 注册过 OnErrorListener ,这时player 内部诘用 OnErrorListener.OnError() 回调方法, 将会把错误信息返回了去。一旦发生错误,MediaPlayer就会进入Error状态,
    为了重新利用Mediaplayer, 在Error 状态时,调用reset 方法将重新恢复到 Idle 就绪状态,
    所以让自已的MediaPlayer注册OnErrorListener 是一个好的编程习惯, 可以从Player 内部返回来的信息帮你找到错误。

  4. 调用prepare 方法,或者 prepareAsync 方法,或者 重载setDataResource 方法。 抛出IllegalStateExceprion 为防止程序错误。

Initialized状态

Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

Prepared状态

Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

Started状态

Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

Paused状态

Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

Stopped状态

Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

PlaybackCompleted状态

Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期