2010-12-15 76 views
1

我有使用MediaPlayer進行流媒體播放的歌曲列表。一些歌曲一直工作,其他人一直不工作。我看不到這些文件之間的差異,並且它們似乎在iTunes等中運行良好。MediaPlayer.prepare在播放m4a文件時拋出IllegalStateException

當歌曲失敗時,它將在mediaPlayer.prepare()行上拋出IllegalStateException。是拋出的IllegalStateException異常中沒有任何有用的信息,(detailMessage爲null,stackState爲null)

這裏是我的代碼

try { 
    mediaPlayer.setDataSource(media.url); 
    setPlayerState(PlayerState.PREPARING); 
    mediaPlayer.prepare(); 
} catch (Exception e) { 
    e.printStackTrace(); 
    Log.e(TAG, "bad stream"); 
} 

這裏是一個URL到文件不起作用: skdy .bryceb.dev.mediarain.com/song.m4a

這裏是一個沒有工作: skdy.bryceb.dev.mediarain.com/song2.m4a

任何想法,爲什麼這個工程上的一些歌曲,別人失敗了?

+0

該URL是用於導致異常的文件之一嗎?如果是這樣,請將網址發佈到不會導致問題的網址,然後我會嘗試進行比較。 – Squonk 2010-12-15 00:45:46

+0

這是一個工程:skdy.bryceb.dev.mediarain.com/song2.m4a – 2010-12-15 00:53:38

+0

嗯,沒什麼我可以告訴你到目前爲止。我可以使用Winamp在URL中傳輸這兩個文件,也可以直接在我的PC上的Chrome中傳輸。我下載了兩個並在GraphEdit中渲染它們,它們都產生相同的圖形並播放無故障。我目前在項目之間,所以會再多玩一些 - 如果我找到答案,我會盡快回復您。 – Squonk 2010-12-15 01:16:50

回答

2

謝謝MisterSquonk我相信這種方式可行。

在我的特殊情況下,我的頭撞牆後有一段時間,我意識到在某些歌曲中,我在玩家狀態準備好之前已經達到緩衝量。所以我添加了一個檢查,以確保MediaPlayer處於「準備」狀態,然後它工作得很好:

// Media prepared listener 
    mediaPlayer.setOnPreparedListener(
      new MediaPlayer.OnPreparedListener() { 
       public void onPrepared(MediaPlayer mp) { 
        setPlayerState(PlayerState.PREPARED); 
       } 
      }); 

    // Media buffer listener 
    mediaPlayer.setOnBufferingUpdateListener(
      new MediaPlayer.OnBufferingUpdateListener() { 
       public void onBufferingUpdate(MediaPlayer mp, int percent) { 

        // Sometimes the song will finish playing before the 100% loaded in has been 
        // dispatched, which result in the song playing again, so check to see if the 
        // song has completed first 
        if(getPlayerState() == PlayerState.COMPLETED) 
         return; 

        if(getPlayerState() == PlayerState.PAUSED) 
         return; 

        // If the music isn't already playing, and the buffer has been reached 
        if(!mediaPlayer.isPlaying() && percent > PERCENT_BUFFER) { 
         if(getPlayerState() == PlayerState.PREPARED) 
         { 
          mediaPlayer.start(); 
          setPlayerState(PlayerState.PLAYING); 
         } 
         //if it isn't prepared, then we'll wait till the next buffering 
         //update 
         return; 
        } 
       } 
      }); 
0

好吧,我在一個'沙盒'應用程序/活動中共享了一個最小的Mediaplayer實現,我總是保留備用以進行測試。

我可能是錯的,但如果您通過網絡傳輸這些歌曲,則需要在http://前加上url。

我試着用Winamp和Chrome逐字(沒有協議前綴字符串)的網址,他們工作得很好,儘管這些應用程序可能會使用某種形式的智能來解決如何連接/流。

如果我在我的mediaPlayer代碼中嘗試過,我會得到和你一樣的異常,但是如果我在http://前面加上了歌詞,那麼播放的歌曲會很好。

例...

// Activity scope 
Button button; 
CheckBox checkBox; 
String url = ""; 

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //button declared in my activity 
    button = (Button)findViewById(R.id.button); 
    button.setOnClickListener(this); 

    if (!checkBox.isChecked()) 
     url = getString(R.string.url_song1); 
    else 
     url = getString(R.string.url_song2); 

    mediaPlayer = new MediaPlayer(); 
} 

@Override 
public void onClick(View arg0) { 
    try { 
     Log.i(TAG, "onClick() entered..."); 
     mediaPlayer.setDataSource(url); 
     Log.i(TAG, "Preparing mediaplayer..."); 
     mediaPlayer.prepare(); 
     Log.i(TAG, "Starting mediaplayer..."); 
     mediaPlayer.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e(TAG, "bad stream"); 
    }  
} 

如果我的歌曲複製到自己的SD卡都發揮很好,只要互聯網URL字符串有一個的「http://」前綴,那麼他們也工作。

相關問題