2013-11-20 200 views
2

我想在Android設備上開發hls播放器,並且我有一些測試流可以播放。我遇到的一個問題是HLS流只是「停止」,在一些隨機位置凍結,可能會在1分鐘後,或20後。我得到的錯誤是:Android AudioFlinger服務器死亡|媒體服務器死亡

11-20 14:14:10.484: W/AudioSystem(18531):AudioFlinger服務器死亡! 11-20 14:14:10.484:W/IMediaDeathNotifier(18531):媒體服務器死亡

和 11-20 14:14:10.484:E/MediaPlayer的(18531):錯誤(100,0)

我基本上不知道如何防止或重新啓動流如果發生這種情況。我甚至不知道它爲什麼會發生。所以如果有人能回答這個問題,我會很高興:)。

// Create a new media player and set the listeners 
     mMediaPlayer = new MediaPlayer(); 
     mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       mMediaPlayer.reset(); 
       return false; 
      } 
     }); 
     mMediaPlayer.setDataSource(path); 
     mMediaPlayer.setDisplay(holder); 
     mMediaPlayer.prepareAsync(); 
     //mMediaPlayer.prepare(); 
     if(extras.getString("type") == "VOD") { 
      mMediaPlayer.setOnBufferingUpdateListener(this); 
      mMediaPlayer.setOnCompletionListener(this); 
     } 
     mMediaPlayer.setOnPreparedListener(this); 
     mMediaPlayer.setScreenOnWhilePlaying(true); 


     //mMediaPlayer.setOnVideoSizeChangedListener(this); 
     //mcontroller = new MediaController(this); 
     mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 


    public void onPrepared(MediaPlayer mediaplayer) { 
    Log.d(TAG, "onPrepared called"); 
    mIsVideoReadyToBePlayed = true; 
    if (mIsVideoReadyToBePlayed) { 
     runOnUiThread(new Runnable() { 
      public void run() { 
       startVideoPlayback(); 
      } 
     }); 
    } 
    mcontroller = new MediaController(this); 
    mcontroller.setMediaPlayer(this); 
    mcontroller.setAnchorView(findViewById(R.id.surface)); 
    mcontroller.setEnabled(true); 
    handler.post(new Runnable() { 

     public void run() { 
      mcontroller.setEnabled(true); 
      mcontroller.show(); 
     } 
    }); 
} 

請告訴您是否需要更多代碼。

回答

1

我想這就是它說的:網絡問題已使MediaPlayer認爲服務器關閉了連接。

對於HTTP流式傳輸,我建議在設備上粘貼一個簡單的代理服務器,這樣您可以更多地控制發送給播放器的數據。 Apache庫本身很容易使用,或者你可以拿起一個像Naga這樣的輕量級包裝。如果出現這樣的錯誤,您可以在停止的確切字節處重新連接請求。還有其他一些好處,如能夠在需要時緩存數據,但是控制遠程通信則提供了您在MediaPlayer中無法找到的自由等級。

備註供將來參考:這個答案對HLS並不好。查看評論。

+0

好吧,是它的Android設備誰不小心滴連接或數據包不是從服務器到達的設備?由於我是一個noob,我可能有很多東西,我可以添加,使它更好地工作,我相信。 我可以重新連接我的當前設置嗎? – DreamHawk

+0

這實際上是一個不好的答案......即使我寫了HLS(我的道歉),我仍然在考慮定期HTTP流式傳輸。考慮到段文件應該相對較短,您可能不希望請求特定的字節。最簡單的方法是當你收到這樣的錯誤時,通過reset/setDataSource/prepare/start過程。 – Dave

+0

謝謝,這是一種合適的方式嗎? 由於android設備或服務器,MediaPlayer會斷開連接嗎? – DreamHawk

0

檢查您的錯誤偵聽器錯誤(100,0)。釋放播放器不要重置它並重新創建另一個對象。

一個原因是多線程訪問使用AudioService的MediaPlayer服務。另一種可能是你的情況是內存問題。儘量減少運行在一起的玩家數量,並密切關注您的應用使用多少內存。

這裏是如何檢測錯誤(100,0):

mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
     public boolean onError(MediaPlayer mp, int what, int extra) { 
      mMediaPlayer.release(); 
      //create another mediaplayer preferrably in another thread 
      return false; 
     } 
    });