2010-12-16 74 views
29

我必須在這裏丟失一些明顯的東西,但似乎找不到任何可以讓我確定何時MediaPlayer正在緩衝音頻的東西。我正在流式傳輸互聯網音頻,我想顯示一個緩衝指示符,但我試過的任何東西都不允許我知道MediaPlayer何時中斷要緩衝的音頻,所以我無法正確顯示緩衝指示符。任何線索?Android - 如何判斷MediaPlayer何時緩衝

+0

對此有何更新?我正在嘗試製作流媒體視頻播放器。所有評論歡迎。 – Sen 2011-05-12 09:17:07

回答

6

@丹尼爾,根據你對@ JRL的回答的評論,你可能會通過旋轉線程並等待超時來獲得這個工作。

DetectBufferTimeout.java(未經測試)會很好。

但是,我確實認爲旋轉這個單獨的線程是有點破解的。也許OnBufferingUpdateListener可以保證它調用onBufferingUpdate()的頻率,不管緩衝進度是否發生了變化,所以我們可以檢測到我們是否一遍又一遍地獲得相同的值。

+1

謝謝,馬特。我遇到的問題是沒有通知MediaPlayer何時實際暫停要緩衝的軌道。但是你的建議還是不錯的。我認爲應用同樣的技術......而不是檢查緩衝進度,我應該檢查播放進度。如果它沒有更新並且沒有從我的末端暫停或停止,則MediaPlayer實例必須暫停它以便緩衝更多音頻數據。謝謝! – Daniel 2011-04-13 04:46:59

+0

啊,是的,我沒有意識到你想知道賽道何時暫停_specifically_,因爲它已經通過它的緩衝區。 – 2011-04-15 03:03:33

1

註冊一個OnBufferingUpdate監聽器。

+2

謝謝。我已經這樣做了,但這似乎只是告訴我緩衝的音軌的百分比。我試圖與賽道的當前比賽時間進行比較。我想也許我可以看到當前緩衝區百分比是否等於當前播放時間百分比。但是這不起作用,因爲MediaPlayer似乎有一些緩衝代碼被烘焙,以便在緩衝區完全運行之前進行緩衝。所以我仍然無法告訴(或控制)曲目何時緩衝。希望我錯過了什麼? – Daniel 2010-12-16 21:53:11

10

好吧,我現在覺得有點平反。我檢查了潘多拉的應用程序,它不顯示緩衝指標。當音樂中斷緩衝時,它就像沒有任何事情發生一樣,UI看起來還在播放。所以我得出的結論是,如果您使用的是MediaPlayer,則無法確定曲目是否暫時暫停以進行緩衝。

但是,我確實注意到有幾個MediaPlayer常量可以使用: MEDIA_INFO_BUFFERING_START和MEDIA_INFO_BUFFERING_END。但是他們只能在9級以上的API中使用,而且文檔對此沒有提及。我假設他們可以與OnInfoListener一起使用。

我很失望,但至少我現在可以停止旋轉我的輪子並轉向其他東西。

47

像下面(API級≥9):

mp.setOnInfoListener(new OnInfoListener() { 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     switch (what) { 
      case MediaPlayer.MEDIA_INFO_BUFFERING_START: 
       loadingDialog.setVisibility(View.VISIBLE); 
       break; 
      case MediaPlayer.MEDIA_INFO_BUFFERING_END: 
       loadingDialog.setVisibility(View.GONE); 
       break; 
     } 
     return false; 
    } 
}); 

注意:有一個已知的錯誤在機器人。在播放HLS流時,它從不調用OnInfoListener或OnBuffering。檢查此鏈接OnInfoListener bug

+0

這個作品完美!謝謝 – 2013-07-05 06:49:51

+5

「mediaPlayer」啓動緩衝的事實確保它已停止播放嗎?我不確定這一點。 – shujj 2014-06-09 05:40:00

+0

我欠你一百萬;) – ZimaXXX 2016-04-15 14:17:38

0

您可以使用一個線程來檢查MediaPlayer的當前位置。如果位置不變,您可以得出結論媒體處於緩衝狀態。這裏是我寫的完整教程:http://www.ottodroid.net/?p=260