1

Вопрос по media-player, audio, android – MediaPlayer как остановить воспроизведение нескольких звуков

У меня есть кнопка, которая играет звук. Когда я нажимаю кнопку несколько раз, он воспроизводит звук несколько раз. Это хорошо, я хочу этого. Но когда я нажимаю кнопку остановки, он должен остановить все звуки, которые воспроизводятся в данный момент. Я использовал:

   while (mediaPlayer.isPlaying()){mediaPlayer.stop();}

но это не работает, звуки продолжают играть. Кто-нибудь может мне помочь? Вот мой полный код:

public class HelloSoundboard extends Activity {
MediaPlayer mediaPlayer;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button item1 = (Button)findViewById(R.id.item1);
    item1.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
           mediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.atyourservice);
           mediaPlayer.start();
       }
    });

    Button stop = (Button)findViewById(R.id.stop);
    stop.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
          while (mediaPlayer.isPlaying()){mediaPlayer.stop();}
        //  mediaPlayer.stop();
       }
     });
 }
}
  • Следует отметить, что SoundPool был создан для небольших звуковых эффектов, и буфер не должен увеличиваться до больших. Один из моих звуков был отключен из-за его длины. так что мне все еще нужно использовать MediaPlayer

    от John
  • Спасибо, я немного поэкспериментировал со SoundPool, но не смог вообще остановить воспроизведение звука. Также не мог найти что-нибудь об этом в WWW, вы знаете, как остановить все звуки в саундпуле?

    от John
  • +1 Поскольку это лучшее решение, я просто должен был добавить свой ответ, чтобы полностью объяснить, почему.

    от
  • я получил следующую ошибку с вашим кодом: метод add (MediaPlayer) в списке типа & lt; MediaPlayer & gt; не применимо для аргументов (недействительным)

    от John
  • очень приятно (голос бората), спасибо !!!

    от John
  • моя ошибка, см редактировать

    от
  • 2

    Вы можете использовать список

    MediaPlayers:

    List<MediaPlayer> mps = new ArrayList<MediaPlayer>();
    Button item1 = (Button)findViewById(R.id.item1);
    item1.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
           MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.atyourservice);
           mp.start();
           mps.add(mp);
       }
    });
    
    Button stop = (Button)findViewById(R.id.stop);
    stop.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
          for (int i = mps.size() - 1; i >= 0; --i) { //changed ++i to --i
              if (mps.get(i).isPlaying()) {
                  mps.get(i).stop();
              }
              mps.remove(i);
          }
       }
     });
    

  • 2

    Я не уверен в этом

    но я думаю, что лучше, если вы используете SoundPool.

    «SoundPool предназначен для коротких клипов, которые могут быть распакованы в памяти для быстрого доступа, это лучше всего подходит для звуковых эффектов в приложениях или играх».

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

  • 2

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

    Что касается остановки всех активных потоков, то для этого нет встроенной функции, но ее легко выполнить способом, аналогичным существующему коду. Как примечание стороны, естьautoPause() метод, который останавливает все потоки, но не завершает их воспроизведение (как подсказывает имя метода). Вот простой пример для управления вашими аудиопотоками:

    //SoundPool initialization somewhere
    SoundPool pool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    //Load your sound effect into the pool
    int soundId = pool.load(...); //There are several versions of this, pick which fits your sound
    
    List<Integer> streams = new ArrayList<Integer>();
    Button item1 = (Button)findViewById(R.id.item1);
    item1.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
           int streamId = pool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
           streams.add(streamId);
       }
    });
    
    Button stop = (Button)findViewById(R.id.stop);
    stop.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
          for (Integer stream : streams) {
              pool.stop(stream);
          }
          streams.clear();
       }
    });
    

    Намного более эффективно использовать память для управления списком значений streamID, чемMediaPlayer экземпляры, и ваши пользователи будут вам благодарны. Также учтите, что звонить можноSoundPool.stop() даже если идентификатор потока больше не действителен, поэтому вам не нужно проверять существующее воспроизведение.

    НТН