mediaplayer.prepareは、M4Aファイルを再生するときにIllegalStateExceptionを投げています
-
10-10-2019 - |
質問
Mediaplayerを使用してストリーミングしている曲のリストがあります。一貫して機能する曲の中には、一貫して機能しないものもあります。これらのファイル間に違いが見えないので、iTunesなどでうまく機能しているようです。
曲が失敗すると、mediaplayer.prepare()ラインに違法な標識が投入されています。スローされているIllegalStateExceptionには有用な情報がありません(詳細は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
これがいくつかの曲で機能し、他の曲で失敗する理由はありますか?
解決
MistersQuonkありがとうございます。そうすればうまくいくと確信しています。
私の特定のケースでは、しばらくの間頭を壁にぶつけた後、いくつかの曲では、プレイヤー状態が準備が整う前に緩衝額に到達していることに気付きました。そこで、メディアプラヤが「準備された」状態にあることを確認するためにチェックを追加しました。
// 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;
}
}
});
他のヒント
わかりました、私は「サンドボックス」アプリ/アクティビティで最小限のメディアプラエアの実装を一緒にハッキングしました。
私は間違っているかもしれませんが、これらの曲をネット上にストリーミングしている場合は、http://でURLにプレフィックスする必要があります。
WinampとChrome Verbatim(プロトコルプレフィックス文字列なし)でURLを試しましたが、それらは正常に動作しますが、これらのアプリケーションの両方が何らかの形のインテリジェンスを使用して接続/ストリーミングの方法を説明する可能性があります。
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://」プレフィックスがある限り、曲を正常に再生する場合、それらも機能します。