如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:
1) 延时时间较长,且资源占用率高。
2) 不支持多个音频同时播放。
Android中除了MediaPlayer播放音频之外还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放。
SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数。
我觉得SoundPool使用起来很方便。
SoundPool提供了如下4个load方法:
int load(Context context, int resld, int priority):从 resld所对应的资源加载声音。
int load(FileDescriptor fd, long offset, long length, int priority):加载 fd 所对应的文件的offset开始、长度为length的声音。
int load(AssetFileDescriptor afd, int priority):从afd所对应的文件中加载声音。
int load(String path, int priority):从path对应的文件去加载声音。
为了更好地管理SoundPool所加载的每个声音的1D,程序一般会使用一个HashMap对象来管理声音。
归纳起来,使用SoundPool播放声音的步骤如下:
1) 调用SoundPool的构造器创建SoundPool的对象。
2) 调用SoundPool对象的load()方法从指定资源、文件中加载声音。最好使用HashMap< Integer, Integer>来管理所加载的声音。
3) 调用SoundPool的play方法播放声音。
下面看看一个实例吧,pop项目里面的。package cn.edu.bztc.pop;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
public class SoundStuff extends Activity implements View.OnClickListener,View.OnLongClickListener{
//爆炸声(点击)
SoundPool sp;
int explosion=0;
MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
View v=new View(this);
setContentView(v);
v.setOnClickListener(this);
v.setOnLongClickListener(this);
sp=new SoundPool(5,AudioManager.STREAM_MUSIC,0);
explosion=sp.load(this, R.raw.explosion, 1);
mp=MediaPlayer.create(SoundStuff.this, R.raw.aliee);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(explosion!=0){
sp.play(explosion, 1,1, 0, 0, 1);
}
}
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
mp.start();
return false;
}
}
注意:
1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌 曲或者做游戏背景音乐。
2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。Android开发网建议使用这两个方法的时候尽可能多做测试工作,还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。
3. SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。
其实很简单。的,。