MediaPlayer

音視頻文件和流的播放控制是通過狀態機控制的。

一:MediaPlayer的狀態圖:(單箭頭弧表示同步方法調用,雙箭頭弧表示異步方法調用)

MediaPlayer State diagram

1:當MediaPlayer對象通過new創建時或者通過調用reset()復原時,它的狀態是Idle狀態。當調用release()之後它的狀態是End狀態。MediaPlayer的生命週期是在這兩個狀態之間的。

通過new創建的MediaPlayer對象和通過reset()復原得到的MediaPlayer對象進入Idle狀態是有重要區別的,通過這兩種方式進入的Idle狀態時調用如下方法都會導致程序錯誤:

getCurrentPosition()getDuration()getVideoHeight()getVideoWidth()setAudioStreamType(int),setLooping(boolean)setVolume(float, float)pause()start()stop()seekTo(int)prepare() orprepareAsync() 。如果是通過創建MediaPlayer對象進入的Idle狀態時調用的這些方法,將保持狀態不變,但是如果是通過reset()復原得到MediaPlayer對象進入的Idle狀態時調用這些方法,將觸發OnErrorListener.onError()這個方法,狀態將轉移到Error狀態。

建議當MediaPlayer將時間不再使用時,立即調用release()方法。這樣被與MediaPlayer對象相關的內部引擎佔用的資源將可以被立即釋放。一旦MediaPlayer處於End狀態將沒有辦法使它回到其他狀態。

由new創建的MediaPlayer對象處於Idle狀態,而用creat()方法創建的MediaPlayer對象處於Prepared狀態。

2.一般來說,一些播放控制操作可能由於各種原因失敗,如不支持的音頻/視頻格式,分辨率過高,流超時等。因此,在這種情況下的錯誤報告和恢復需要重點關注。有時候由於程序錯誤,會在錯誤的狀態執行播放控制操作。如果這時候通過setOnErrorListener(android.media.MediaPlayer.OnErrorListener)提前註冊了OnErrorListener,那麼播放器的內部引擎將調用OnErrorListener.onError()方法。

一旦錯誤發生,MediaPlayer對象將進入錯誤狀態。

爲了將MediaPlayer對象從Error狀態中恢復,可以調用reset()方法將對象恢復到Idle狀態。

在應用程序中註冊一個OnErrorListenner來從內部發現錯誤並通知外部的播放器引擎是一個不錯的編程實踐。

通過拋出IllegalStateException異常的方式防止程序出現在錯誤狀態調用prepare()、prepareAsync()等方法。

3.調用setDataSource(FileDescriptor), or setDataSource(String), or setDataSource(Context, Uri), orsetDataSource(FileDescriptor, long, long)方法讓MediaPlayer對象從Idle狀態轉移到Initialized狀態。

如果在其他狀態調用setDataSource()將拋出IllegalStateException異常。

4.在MediaPlayer實例可以開始播放操作前應該先進入Prepared狀態。

有兩種方式可以進入準備狀態:在調用完prepare()(同步)方法後狀態立刻轉移到Prepared狀態;調用prepareAsync()(異步)方法後對象首先轉移至Preparing狀態,此時內部播放引擎繼續完成剩下的準備工作直至準備工作完成。如果通過setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)提前註冊成功了OnPreparedListener,當準備工作完成或者是prepare()方法返回後,內部播放引擎將調用OnPreparedListener接口的onPrepared()方法。

Preparing是暫時的狀態。

如果在其他狀態調prepare()或prepareAsync()方法將拋出lStateException異常。

當處於Prepared狀態時,一些特性比如音視頻的音量等可以通過調用相應的方法調整。

5.想要開始播放音視頻文件,start()方法必須被調用。當成功調用start()方法後,MediaPlayer對象將處於Started狀態。

當處於Started狀態時,如果已經通過 setOnBufferingUpdateListener(OnBufferingUpdateListener)提前註冊了OnBufferingUpdateListener,內部引擎將調用OnBufferingUpdateListener.onBufferingUpdate()回調方法。這個回調允許流媒體時當應用程序跟蹤緩衝狀態。

調用start()方法不會影響到已經處於Started狀態的MediaPlayer對象。

6.播放可以暫停和停止並且當前播放位置可以調整。播放通過pause()方法暫停。當調用完pause()方法,MediaPlayer對象處於Paused狀態。

在調用isPlaying()方法前需要一些時間讓狀態更新。

可以調用start()方法從暫停狀態中恢復播放,並且進入Started狀態。

調用paused()方法對已經處於Paused狀態的MediaPlayer對象沒有影響。

7.調用stop()方法可以停止播放,並且讓MediaPlayer對象從Started, Paused, Prepared 或PlaybackCompleted狀態進入Stopped狀態。

一旦進入Stopped狀態,只有當調用 prepare()或prepareAsync()方法後可以設置MediaPlayer對象進入Prepared狀態。

調用stop()方法對已經處於Stopped狀態的MediaPlayer對象沒有影響。

8.播放位置可以通過調用 seekTo(int)方法調整。

雖然異步seekTo(int)調用可以立刻返回,但是事實上seek操作需要花費一些時間來完成,特別是流式音視頻文件時。

如果OnSeekCompleteListener已經提前通過 setOnSeekCompleteListener(OnSeekCompleteListener)註冊完成,一旦seek操作完成,內部播放引擎會調用OnSeekComplete.onSeekComplete()方法。

 seekTo(int)方法也可以在其它狀態時被調用,比如 Prepared, Paused 和PlaybackCompleted 狀態。

實際的當前播放位置可以通過調用 getCurrentPosition()方法獲取,這有助於音樂播放器等應用程序跟蹤播放進度。

9.當播放到達末尾時,播放結束。

如果播放的循環模式設置爲真,則回到Started狀態。否則,如果 OnCompletionListener 已經提前通過setOnCompletionListener(OnCompletionListener)註冊了,播放引擎調用OnCompletion.onCompletion()方法,處於PlaybackCompleted狀態。

當播放完成後,調用start()重新開始播放音視頻文件。

二:回調

通過調用對應方法設置相應監視器。……

三:一些接口說明

四:一些常量

五:方法說明

http://wear.techbrood.com/reference/android/media/MediaPlayer.html#setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener)



發佈了9 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章