2010-12-15 14 views
1

MediaPlayerを使用してストリーミングしている曲のリストがあります。一部の曲は一貫して動作し、他の曲は一貫して動作しません。私はこれらのファイルの違いを見ることはできません、そして、彼らはiTunesなどでうまくいくようです。MediaPlayer.prepareはm4aファイルを再生するときにIllegalStateExceptionをスローしています

曲が失敗すると、mediaPlayer.prepare()行にIllegalStateExceptionがスローされます。スローされるIllegalStateExceptionがここ

(detailMessageがstackStateがnull、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

この例外は、例外の原因となるファイルの1つです。もしそうなら、問題を引き起こさないものにURLを投稿すれば、私は比較しようとします。 – Squonk

+0

ここには動作するものがあります:skdy.bryceb.dev.mediarain.com/song2.m4a –

+0

うーん、これまでに何も言えません。私は、Winampを使用してURLから両方のファイルをストリーミングすることができます。私は両方をダウンロードしてGraphEditでレンダリングし、両方とも同じグラフを作成し、グリッチフリーで再生します。私は現時点でプロジェクトの間にいるので、もう少し周りに遊びます - 私は答えを見つけるなら、私はあなたに戻ってきます。 – Squonk

答えて

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

[OK]を、私は常にテストのために余裕がある 'サンドボックス'アプリ/アクティビティで最小限のMediaplayer実装をハッキングしました。

私は間違っているかもしれませんが、ネットでこれらの曲をストリーミングする場合は、URLの先頭にhttp://を付ける必要があります。

私はWinampとChromeをそのまま使用しました(プロトコルプレフィックス文字列なし)、うまく機能しましたが、両方のアプリケーションが接続/ストリームの仕組みを理解するために何らかの情報を使用する可能性があります。

私は私のmediaPlayerコードでそれを試しても、あなたと同じ例外が発生しますが、http://でURLにプレフィックスを付けると、その曲は正常に再生されます。

例...

// 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を://」接頭辞、その後、彼らはまた、動作します。

関連する問題