#java #android #media-player
#java #Android #Медиаплеер
Вопрос:
вот несколько цитат из ссылки на разработчика, которые после прочтения не могут заставить мой звук в игре работать. Может быть, вы можете мне помочь?
«после перехода в остановленное состояние воспроизведение не может быть запущено до тех пор, пока не будут вызваны prepare() или prepareAsync (), чтобы снова перевести объект MediaPlayer в подготовленное состояние».
В моем классе заставки я использую Media Player .create, чтобы найти ресурс и подготовить его. Затем я продолжаю воспроизведение и останавливаю его. Я использую .reset после его остановки.
пример.
private MediaPlayer mpSplash;
mpSplash = MediaPlayer.create(this, R.raw.splashscream);
mpSplash.start();
mpSplash.stop();
mpSplash.reset();
В моем игровом цикле в моем классе character я снова использую create для новой переменной медиаплеера, чтобы загрузить и подготовить другой звук. Когда я использую Start, мои программы выдают ошибку, поэтому я пытаюсь вручную подготовить ее до с помощью .prepare, и это показывает красную строку, указывающую на ошибку ввода-вывода. Я попробовал .prepareasync и это также не сработало.
пример.
private MediaPlayer mpBearHurt;
mpBearHurt = MediaPlayer.create(cxt, R.raw.bear_hurt);
mpBearHurt.reset();
mpBearHurt.prepareAsync();
mpBearHurt.start();
Вот ссылка на ресурсы разработчика…
http://developer.android.com/reference/android/media/MediaPlayer.html
В конце концов, независимо от того, как я меняю местами и пытаюсь подготовить и сбросить, а что нет, я не могу заставить свою программу не закрываться принудительно.
Спасибо, и я надеюсь, что мы сможем работать вместе, чтобы решить эту проблему!
Комментарии:
1.
mpBearHurt
это новый mediaplayer, он не находится в остановленном состоянии. Проблема в любой ошибке, которую вы получаете при вызовеmpBearHurt.start()
. Пожалуйста, опубликуйте ошибку.
Ответ №1:
Швиц понял. Если вы не используете потоковую передачу, вы обычно можете просто использовать prepare()
. Я бы рекомендовал не создавать новые экземпляры постоянно. Вместо этого вы можете просто установить источник данных существующего проигрывателя и повторно использовать его. Например:
MediaPlayer mp = new MediaPlayer();
AssetFileDescriptor bearAfd = getResources().openRawResourceFd(R.raw.bear_hurt);
AssetFileDescriptor screamAfd = getResources().openRawResourceFd(R.raw.splashscream);
mp.setDataSource(bearAfd.getFileDescriptor(), bearAfd.getStartOffset(), bearAfd.getLength();
mp.prepare();
mp.start();
//then to set it to another one
mp.setDataSource(screamAfd.getFileDescriptor(), screamAfd.getStartOffset(), screamAfd.getLength();
mp.prepare();
mp.start();
Как только вы начнете создавать слишком много медиаплееров, у вас, вероятно, закончится память или перегрузится звуковое оборудование, и вы получите множество, казалось бы, случайных ошибок и сбоев.
Ответ №2:
Если вы вызываете, prepareAsync
то вы не можете вызвать start
непосредственно после этого, вы должны использовать OnPreparedListener
обратный вызов для определения того, когда вызывать start
. В качестве альтернативы вы могли бы просто вызвать prepare
вместо этого.
Комментарии:
1. Почему у него проблемы с моим вызовом prepare();?
2. @Kirk Becker проблема в том, что вы не вызываете,
prepare
вы вызываетеprepareAsync
, поэтому, когда вы вызываете start, медиаплеер на самом деле еще не готов.
Ответ №3:
Первый комментарий — нет никакой связи между двумя объектами MediaPlayer.
(если только вы не используете фокус звука — что, похоже, здесь не так)
Проблема заключается в том, что делается во втором примере кода.
-
Нет необходимости вызывать prepare при использовании метода create — посмотрите на http://developer.android.com/guide/topics/media/mediaplayer.html#mediaplayer
-
Вызов reset() переводит MediaPlayer в состояние ожидания — вы должны вызвать setDataSource — посмотрите наhttp://developer.android.com/reference/android/media/MediaPlayer.html#State Diagram
Вот как должен выглядеть второй код:
private MediaPlayer mpBearHurt;
mpBearHurt = MediaPlayer.create(cxt, R.raw.bear_hurt);
mpBearHurt.start();
Вы можете делать все, что захотите, с другим объектом MediaPlayer, вы даже можете продолжать его воспроизведение, если хотите 🙂