2

MediaPlayerを使用してストリーミングしている曲のリストがあります。一部の曲は一貫して機能し、他の曲は一貫して機能しません。これらのファイルの違いはわかりませんが、iTunesなどで問題なく再生されているようです。

曲が失敗すると、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

これが一部の曲で機能し、他の曲では失敗する理由はありますか?

4

2 に答える 2

3

ありがとう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;
                    }
                }
            });
于 2010-12-15T22:07:13.170 に答える
0

OK、私は最小限のMediaplayer実装を、テストのために常に予備として保持している「サンドボックス」アプリ/アクティビティで一緒にハックしました。

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

WinampとChromeを逐語的に(プロトコルプレフィックス文字列なしで)URLを試してみましたが、どちらのアプリケーションも何らかの形のインテリジェンスを使用して接続/ストリーミングの方法を理解している可能性がありますが、正常に機能しました。

mediaPlayerコードでそれを試した場合、あなたと同じ例外が発生しますが、URLの前に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://」プレフィックスが付いている限り、それらも機能します。

于 2010-12-15T03:40:27.853 に答える