Подтвердить что ты не робот

Ошибка медиаплеера (-19,0) после повторных игр

У меня есть игра, в которой звук воспроизводится, когда уровень завершен. Все работает нормально, но с повторением 10 или 20 раз логарифм неожиданно сообщает: "Ошибка MediaPlayer (-19,0)" и/или "Начало MediaPlayer запускается в состоянии 0", и звуки больше не выполняются.

У меня первоначально были все звуки в формате mp3, но, прочитав, что ogg может быть более надежным, я преобразовал их все в ogg, но ошибки оказались одинаковыми.

Любая идея, как я могу исправить эту проблему?

4b9b3361

Ответ 1

Я думаю, что вы не выпускаете медиаплееры, которые вы используете для воспроизведения звука. Вам нужно освободить() медиаплееры, иначе ресурсы не будут выпущены, и вы скоро получите из памяти (так как вы в следующий раз назначаете их). поэтому, я думаю, вы можете играть дважды или даже трижды... но не раз, не отпуская ресурсы

Ответ 2

У меня была такая же проблема, я решил ее, добавив следующий код для выпуска проигрывателя:

mp1 = MediaPlayer.create(sound.this, R.raw.pan1);
mp1.start();
mp1.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        mp.release();

    };
});

Ответ 3

MediaPlayer не является хорошим вариантом, когда вы играете с небольшими звуковыми эффектами, так как пользователь может быстро нажимать на несколько кнопок, и вам нужно будет создать объект MP для всех из них, который не будет синхронно, Вот почему вы не слышите звуки для каждого щелчка. Перейдите к классу SoundPool, который позволяет сохранять меньшие звуки, загруженные в память, и вы можете воспроизводить их в любое время без какого-либо отставания, которое вы ощущаете в медиаплеере. http://developer.android.com/reference/android/media/SoundPool.html Вот хороший учебник: http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html

Ответ 4

Я пытаюсь удалить эмулятор и новый эмулятор создания для удаления ошибки (-19,0) медиаплеера.

Ответ 5

Я решил как ошибки (-19,0), так и (-38,0), создавая новый объект MediaPlayer каждый раз, прежде чем играть и отпускать его после этого.

До:

void play(int resourceID) {
    if (getActivity() != null) {

         //Using the same object - Problem persists
        player = MediaPlayer.create(getActivity(), resourceID);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
            }
        });

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

    }
}

После:

 void play(int resourceID) {

    if (getActivity() != null) {

        //Problem Solved
        //Creating new MediaPlayer object every time and releasing it after completion
        final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
            }
        });

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

    }
}

Ответ 6

Это очень старый вопрос, но это было первым в моих результатах поиска. Таким образом, другие люди с одинаковой проблемой, вероятно, попадут на эту страницу в конце концов.

В отличие от некоторых других, вы можете использовать MediaPlayer для небольших звуков, не используя много памяти. Я добавлю немного модифицированный снипп из своего приложения звуковой платы, чтобы показать вам, что я получаю.

private MediaPlayer mp;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);

    mp = new MediaPlayer();

}

private void playSound(int soundID){
     mp.reset();
     AssetFileDescriptor sound = getResources().openRawResourceFd(soundID);
     try {
         mp.setDataSource(sound.getFileDescriptor(),sound.getStartOffset(),sound.getLength());
         mp.prepare();
     } catch (IOException e) {
         e.printStackTrace();
     }
     mp.start();


}

с тем, как я его настроил, вы создаете объект MediaPlayer, который вы будете использовать каждый раз при воспроизведении звука, чтобы не использовать слишком много места.

Вы вызываете .reset() вместо .release(), потому что .release() используется, только если вы удаляете объект, однако вы хотите сохранить свой объект MediaPlayer.

Вы используете файл assetfiledescriptor для установки нового звукового файла для вашего медиаплеера, вместо того, чтобы устанавливать новый объект на ваш адрес медиапланера, так как таким образом вы создаете новые объекты в методе, которые не обрабатываются должным образом, и вы в конечном итоге будете запускать в ту же ошибку, что и вы описали.

Это только один из многих способов использования MediaPlayer, но я лично считаю, что он наиболее эффективен, если вы используете его только для небольших звуковых приложений. Единственная проблема заключается в том, что он относительно ограничивает то, что вы можете выполнить, но это не должно быть большой проблемой, если вы действительно используете его для небольших звуковых приложений.