我正在做一个项目,我必须在一个活动中加载 6 种不同的声音,并在单击按钮时播放所有声音。声音文件不是那么大,但问题是它们可能会更多。所以我的问题是这是在单个活动中加载声音文件的最快方法。出于测试目的,我使用 res/raw 文件夹来存储声音文件并尝试使用两种不同的方法来播放文件,但结果并不让我满意。这是两种不同类型的代码:
方法一:
Button first = (Button) findViewById(R.id.one);
Button second = (Button) findViewById(R.id.two);
first.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumtwo);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
});
}
});
second.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumone);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
});
}
});
方法二:
private SoundPool spool;
private int soundID,soundID2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
spool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundID = spool.load(this, R.raw.drumone, 1);
soundID2 = spool.load(this, R.raw.drumtwo, 1);
Button three = (Button) findViewById(R.id.three);
three.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Sound();
}
});
}
public void Sound(){
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
float volume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
spool.play(soundID, volume, volume, 1, 0, 1f);
};
但问题是这两种方法都很慢..我需要找到一种更快的方法来播放声音..但是现在我点击按钮播放声音后几乎有一秒钟的时间。
你能给我一些建议如何更快地播放声音吗?我应该在应用程序启动时将它们加载到缓存中还是将它们保存在数据库或其他地方(事实上,我认为数据库不是一个好的选择,但是我想听听一些建议)。或者也许从资产文件夹中加载它们,但我认为它仍然会很慢。
那么有什么想法或建议吗?提前致谢!