2013-03-18 305 views
3

顯然不會引發異常,以便在緩衝流式音頻內容時識別錯誤。例如,我斷開了我的路由器,應用程序將繼續嘗試緩衝整個時間。當我重新連接時,它會完成緩衝並在斷開連接一分鐘後繼續進行!檢測緩衝錯誤(或超時)Android MediaPlayer - 使用計時器超時?

所以問題是我不能讓我的用戶坐在那裏很長時間沒有考慮到一個問題。使用Android媒體播放器檢測緩衝問題的正確方法是什麼?

我在考慮使用Timer超時。我會以15秒開始(使用代理我測試了一個5kbps的連接,這將是最糟糕的情況,能夠在6-10秒內開始播放,所以我認爲15秒將是一個合理的超時時間)。這聽起來像是一個好計劃嗎?如果是這樣,我應該創建一個每個緩衝區嘗試一個新的計時器,或者我應該在播放服務的整個生命週期保持相同的計時器?

所以基本上我問兩個問題:

1)什麼是檢測一個緩衝區有問題的正確方法?有沒有我忽略的聽衆?我試過MediaPlayer.OnErrorListener當然不會在我的測試中觸發。我的結論是我必須有一個超時檢測緩衝錯誤。

2)如果我對號碼是正確的,那麼使用定時器的正確方法是什麼?創建一個與每個緩衝區嘗試或重用相同的? 編輯也應該重新啓動(或取消並創建一個新的)Timer onBufferUpdate?有了onBufferUpdate監聽器,我應該知道一些數據會回來,所以應該重置計時器。

回答

1

您應該看到這篇文章。 mediaplayer有一個ErrorListener來獲取任何錯誤。

http://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html

+3

我會檢查,現在的問題是,如果它只是坐在那裏一分鐘的OnError甚至從來沒有被解僱。 – 2013-03-18 16:49:55

+1

這不是一篇文章,這是文檔,當然我讀過!這不是RTFM的情況!哈哈:-) – 2013-03-18 16:50:47

+0

對於我來說,和安東尼完全一樣,超時需要很長時間才能打電話給錯誤監聽者。我不知道如何修復它。 – 2013-07-25 11:49:15

4

從你的問題,據我瞭解,主要目的是檢測的情況,如果您的播放器由於停滯到緩衝,並採取其中的一些行動。爲了處理這種情況,我覺得以下2個聽衆可能會有助於識別相同的情況。

MediaPlayer.onBufferingUpdate會提供緩衝的及時進度。所以,如果有兩個回調值相同的percent值,這可能表明潛在的緩衝。

還有另一位聽衆MediaPlayer.onInfoListener有一些您可能感興趣的特定事件。在這個聽衆上,如果whatMEDIA_INFO_BUFFERING_START,則這表示播放器正在暫停播放進行緩衝,即觸發你的邏輯。同樣,MEDIA_INFO_BUFFERING_END表示填充緩衝區後重新開始播放。

0
int count=40;//for 40 seconds to wait for buffering after it will finish the activity 
//boolean timeoutflag=false; 

timeout = new Handler(Looper.getMainLooper()) { 
      @Override 
      public void handleMessage(Message msg) { 
       System.out.println("value of count="+msg.getData().getLong("count")); 
       if (msg.getData().getBoolean("valid")) { 
        if (msg.getData().getLong("count") == 0 && !timeoutflag) 
        { 

         if (pDialog != null && pDialog.isShowing()) 
           { 
           try 
           { 
           pDialog.dismiss(); 
           }catch(Exception e) 
           { 
            e.printStackTrace(); 
           } 
           } 
          Toast.makeText(getApplicationContext(), 
            "Unable To Load This Video", Toast.LENGTH_LONG).show(); 
         finish(); 

        } else { 
        } 

       } 

      } 
     }; 
     timeout.postDelayed(null, 0); 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       while (count > 0) { 
        try { 
         Thread.sleep(1020); 
        } catch (Exception e) { 
        } 

        Message msg = new Message(); 
        Bundle b = new Bundle(); 
        b.putBoolean("valid", true); 
        b.putLong("count", --count); 
        msg.setData(b); 
        timeout.sendMessage(msg); 

       } 

      } 
     }).start(); 
     // set timeoutflag=true; in setOnPreparedListener of video view 
0

對於準備期間的緩衝,您必須設置自己的計時器,該計時器在某個時間間隔後調用player.reset()。這使播放器回到初始狀態。

對於準備後的緩衝(播放期間),您必須監視getPosition()。如果它落後於某個最大值,請調用reset()。這允許您爲播放設置一個體驗閾值。不僅處理連接失敗,而且連接不穩定。

最好的解決辦法是不要使用MediaPlayer。改爲使用公共VLC衍生物。MP有太多的內部私人設計限制,需要可怕的解決方法(例如,CANT添加編解碼器)。在這種情況下,RTFM給你虛假的希望。

除非你正在做一個非常直的android應用程序,不要依賴任何android api。一些開源替代品得到了更好的支持,並且有很好的理由。

(真的bandeely奧利快樂滿意的社論咆哮刪除)