加载多个音频文件的简单方法?

时间:2015-03-20 17:38:54

标签: android performance audio soundpool

我一直试图找到一种加载大量音频文件的好方法。 下面的代码运行正常,但是当我遇到问题时,我需要加载更多的文件。

这是一个测验,当用户选择正确答案时,应播放新的声音。我必须加载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"太重"

1 个答案:

答案 0 :(得分: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();

只要正在播放的声音没有改变,你就可以调用play()。

缺点是必须为每个声音创建一个MediaPlayer。但是你不会同时拥有所有这些内存。此外,它们会立即加载/播放。

修改

这可以通过在SoundtrackManager类中创建MediaPlayer对象的“池”来改进。因此,如果需要其中一个随机声音并且恰好位于该“池”上,则可以避免重新设置常量MediaPlayer。