2015-03-20 1 views
0

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

Это викторина, и когда пользователи выбирают правильный ответ, должен воспроизводиться новый звук. Я должен загрузить более 50 звуков.

В настоящее время, как я загрузить файлы:

this.setVolumeControlStream(AudioManager.STREAM_MUSIC); 
    spool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 

       Context myActivity = getApplicationContext(); 

        primSounds.add(spool.load(myActivity, R.raw.int_prim_c_mel, 1)); 
        primSounds.add(spool.load(myActivity, R.raw.int_prim_d_mel, 1)); 
        primSounds.add(spool.load(myActivity, R.raw.int_prim_e_mel, 1)); 

        kvintSounds.add(spool.load(myActivity, R.raw.int_kvint_c_mel, 1)); 
        kvintSounds.add(spool.load(myActivity, R.raw.int_kvint_d_mel, 1)); 
        kvintSounds.add(spool.load(myActivity, R.raw.int_kvint_e_mel, 1)); 

        oktSounds.add(spool.load(myActivity, R.raw.int_okt_c_mel, 1)); 
        oktSounds.add(spool.load(myActivity, R.raw.int_okt_d_mel, 1)); 
        oktSounds.add(spool.load(myActivity, R.raw.int_okt_e_mel, 1)); 

        ... 

Проблема заключается в том, что этот способ сделать OnCreate «слишком тяжелым»

+0

Вам нужны все 50 загруженных одновременно? Не могли бы вы загрузить некоторые, а затем перезагрузить другой набор после их использования? – codeMagic

+0

Возможно, вопросы викторины случайны, поэтому загрузка должна быть быстрой. – johgru

+0

Можете ли вы узнать, какие аудиосистемы вам понадобятся для каждой викторины, прежде чем вы ее покажете? В таком случае вы можете загрузить аудио для каждой викторины. Итак, Перед тем, как показывать викторину a: загрузить все «a» аудио Когда появляется викторина «a»: загрузка викторины b аудио И так далее – mmark

ответ

0

Here у вас есть возможный обходной путь.

Но в вашем случае у вас будет 50 звуков, загружаемых сразу в какой-то момент. Это означает, что у вас будет достаточно много памяти. приходится сталкиваться с подобной ситуацией перед собой, я думаю, вы можете использовать следующий код:

SoundtrackManager.java

public void prepareSoundtrack(int soundtrackId, Context context) { 
     try { 

      if (mMediaPlayer != null) { 
       mMediaPlayer.release(); 
       mMediaPlayer = null; 
      } 


      mMediaPlayer = MediaPlayer.create(context, soundtrackId); 

     } catch (Exception e) { 
      mMediaPlayer.release(); 
      e.printStackTrace(); 
     } 

    } 

    public void play() { 
     if (mMediaPlayer != null) { 
      try { 
       mMediaPlayer.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

с помощью:

mSoundTrackManager.prepareSoundtrack(R.raw.the_sound, mContext); 
mSoundTrackManager.play(); 

Вы можете назвать игру() пока звук, воспроизводимый, не изменяется.

Недостатком является создание MediaPlayer для каждого звука. Но вы не будете иметь их все в памяти одновременно. Кроме того, они загружаются/воспроизводятся мгновенно.

EDIT:

Это можно было бы улучшить, сделав "пул" объектов MediaPlayer в классе SoundtrackManager. Итак, если один из случайных звуков необходим и находится в этом «пуле», вы можете избежать постоянной настройки MediaPlayer.

+0

Спасибо! Я думаю, что SoundPool - лучший вариант, потому что аудиофайлы находятся в midi и 1-3 секунды. – johgru