MediaPlayer перестает играть примерно через 5 секунд

Сейчас я разрабатываю простую игру, а теперь пора добавить музыку и звуковой эффект. Я пробовал использовать MediaPlayer, как описано здесь: Ошибка проигрывателя мультимедиа Android

Однако у меня есть другая проблема: MediaPlayer перестает воспроизводить музыку примерно через 5 секунд. Что, вероятно, вызывает это?


person Den    schedule 05.06.2011    source источник
comment
Сначала убедитесь, что воспроизводимый вами звук ДЛИТЕЛЬНО 5 секунд :)   -  person Gabriel Negut    schedule 05.06.2011
comment
Вы, вероятно, должны показать нам какой-нибудь MediaPlayer связанный код, а также использовать setOnErrorListener(...) и setOnCompletionListener(...), чтобы увидеть, возможно, возникла ошибка или воспроизведение только что успешно завершилось.   -  person inazaruk    schedule 05.06.2011
comment
Аналогичные проблемы возникали при воспроизведении онлайн-потоков с помощью MediaPlayer с Android 2.3. Наш стрим длился около 2 минут. Мы пришли к выводу, что это, скорее всего, ошибка в конкретном типе потока или видео формата Android r.   -  person ATom    schedule 14.09.2011


Ответы (2)


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

Например:

//ERROR, stops after 5 sec!
public static void playMusic(int id)
{
  MediaPlayer mediaPlayer = MediaPlayer.create(context, id);
  mediaPlayer.setLooping(true);
  mediaPlayer.start();
}

Скорее всего, появится сборщик мусора и очистит объект MediaPlayer.

Это исправило ошибку для меня:

//mediaPlayer-object will not we cleaned away since someone holds a reference to it!
private static MediaPlayer mediaPlayer;

public static void playMusic(int id)
{
    mediaPlayer = MediaPlayer.create(context, id);
    mediaPlayer.setLooping(true);
    mediaPlayer.start();
}
person dac2009    schedule 10.10.2011
comment
Это устранило мой случай этой проблемы. Какое-то безумие, что MediaPlayer может получить gc'd во время воспроизведения. - person Reuben Scratton; 17.12.2011
comment
Очень интересно. Отличный способ объяснить, как работает сборка мусора :) - person ; 22.12.2014
comment
Лучше не делать его статичным, иначе вы создадите себе утечку памяти. Вы всегда можете передать ссылку на действие вашей статической функции playMusic (int), чтобы получить доступ к MediaPlayer или сделать вашу функцию playMusic (int) не статической. - person user1608385; 11.12.2018
comment
setLooping метод больше не существует - person Gerry; 30.12.2018
comment
не работает в последних устройствах. Не могли бы вы помочь мне другими способами. Столкнувшись с этой проблемой для URL-адресов онлайн-потока. - person aswanth bonthala; 05.02.2021

Вы должны создать асинхронный код, чтобы медиаплеер воспроизводил то, что он должен воспроизвести, в фоновом режиме. Что-то вроде этого:

final MediaPlayer mp = MediaPlayer.create(MainActivity.this, R.raw.nomarxia);


                Handler mHandler = new Handler();
                mHandler.postDelayed(new Runnable() {
                    public void run() {
                        mp.start();
                    }
                }, mp.getDuration());
person ktsakiris    schedule 30.01.2020