2011-05-29 94 views
3

我最近觀察到MediaPlayer播放mp3文件時出現了一個非常奇怪的問題。我運行這段代碼(mPlayer是MediaPlayer的):MediaPlayer在暫停後完成

Log.d(TAG, "Pausing"); 
try { 
    mPlayer.pause(); 
    Log.d(TAG, "Paused"); 
} catch (IllegalStateException e) { 
    Log.w(TAG, "exception pausing player"); 
} 

奇怪的是,如果我靠近音頻文件的結尾,玩家將完成通知我OnCompletionListener很短的時間上面的代碼完成。 (我還沒有牽制我究竟如何接近必須的,但它是1/4秒的量級。)例如,下面是一個典型的logcat輸出,當這種情況發生時:

05-27 17:23:43.439: DEBUG/Player(266): Pausing 
05-27 17:23:43.487: DEBUG/Player(266): Paused 
05-27 17:23:43.838: WARN/Player(266): Audio completed (state=PAUSED) 

注意,警告行(從我的OnCompletionListener登錄),超過300毫秒後,pause()回電!

結果是媒體播放器在我不期望的時候進入PlaybackCompleted狀態。這就搞砸了我的代碼的行爲(以及start(),它從頭開始重新開始,而不是播放文件的最後一點)。

這發生在從1.6到2.3的仿真器上以及至少一個運行2.2的設備上。有誰知道這個問題,該怎麼辦?

回答

1

mediaplayer運行在一個單獨的線程,你必須等到ui線程和mediaplayer的線程同步。所以延遲是正常的。玩家可能真的完成了文件,因爲你的暫停命令太遲到達了玩家。試試更長的音頻文件會發生什麼。

可能出現的另一個問題是其他代碼在暫停命令後尋找超出軌道末尾的代碼。聽衆的代碼是什麼?

+0

我很害怕這樣的事情,儘管350毫秒似乎是應用程序和媒體播放器之間的巨大延遲。音頻文件的長度不是問題...它是多麼接近最終用戶試圖暫停它。 (就我而言,這聽起來像音頻播放在結束之前被切斷,但我不能肯定地說,因爲從結尾暫停超過1/4秒沒有問題)。我的完成中的監聽器非常簡單:它會檢查一個字段,指出我的代碼認爲玩家應該進入的狀態,並在出現差異時記錄警告。沒有其他代碼尋求;我也記錄了這一點。 – 2011-05-29 02:32:14

+0

如果用戶暫停音頻會發生什麼讓我們說從頭到尾5s?你在這裏做什麼?你是否也收到完成的電話? – marsbear 2011-05-29 08:56:10

+0

一切都按預期行事。在我的發佈代碼完成後,我將內部標誌設置爲表明我暫停了播放器,沒有收到完成通知,並且在我調用start()時,它會從暫停的位置恢復。只有在非常接近聲音文件末尾時纔會發生這種情況。 – 2011-05-29 14:12:38