MediaPlayer.prepare генерирует исключение IllegalStateException при воспроизведении файла m4a - PullRequest
1 голос
/ 15 декабря 2010

У меня есть список песен, которые я транслирую с помощью MediaPlayer.Некоторые песни постоянно работают, а другие постоянно не работают.Я не вижу разницы между этими файлами, и они, кажется, прекрасно играют в itunes и т. Д.

Когда песни терпят неудачу, это вызывает исключение IllegalStateException в строке mediaPlayer.prepare ().В генерируемом исключении 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

Любые идеи почемуэто работает на некоторых песнях и не на других?

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Спасибо, 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 голосов
/ 15 декабря 2010

Хорошо, я собрал минимальную реализацию Mediaplayer в приложении / деятельности «песочница», которую я всегда оставляю для тестирования.

Я могу ошибаться, но если вы транслируете эти песни по сети, выВам нужно будет префикс URL с http: //.

Я попробовал URL с Winamp и Chrome дословно (без строки префикса протокола), и они работали нормально, хотя, вероятно, оба эти приложения будут использовать некоторую формуинтеллект, чтобы понять, как подключиться / поток.

Если я попробовал это в своем коде 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://', тогда они также работают.

...