我一直试图找到一种加载大量音频文件的好方法。 下面的代码运行正常,但是当我遇到问题时,我需要加载更多的文件。
这是一个测验,当用户选择正确答案时,应播放新的声音。我必须加载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 :(得分: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。