Android 提供了MediaPlayer和SoundPool两个API类来播放音频。
使用场景:如果应用程序经常需要播放固定的,密集的,短促的音效。这时需要使用SoundPool。SoundPool的 优势在于CPU的占用率低和反应延迟小。此外SoundPool还可以支持自行设置声音的品质、音量、播 放比率等参数。
其他的主要应用MediaPlayer于播放,
MediaPlayer局限:
①资源占用率较高、延迟时间较长。
②不支持多个音频同时播放。
SoundPool播放声音时需要注意:
①可以一次加载多个声音,但一定要注意内存限制。
②SoundPool比MediaPlayer的效果好,但也不是绝对不存在的延迟问题,尤其在那些性能不太好的手 机,SoundPool的延迟问题会更严重。
一、SoundPool的使用简介:
SoundPool播放声音的步骤如下。
①调用SoundPool的构造器创建SoundPool的对象。
②调用SoundPool对象的load()方法从指定资源、文件中加载声音。最好使用HashMap<Integer,Integer>来管理 所加载的声音。
③调用SoundPool的play方法播放声音。
- public class SoundTest extends Activity implements OnClickListener{
-
- private Button button1,button2,button3;
//定义一个SoundPool
private SoundPool soundpool;
private HashMap<Integer,Integer> soundMaps = new HashMap<Integer,Integer>();
@Override
public void onCreate(Bundle saveInstanceState)
{
super.onCreate(saveInstanceState);
setContentView(R.layout.main);
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
button3 = (Button)findViewById(R.id.button3);
//设置最多可以容纳10个音频流(即声音源)
soundpool = new SoundPool(10, AudioManager.STREAM, 5);
//load方法加载指定音频文件,并返回所有加载的音频为ID
//此处使用HashMap来管理这些音频流
soundMaps.put(1, soundpool.load(this, R.raw.soundMusic1, 1));
soundMaps.put(2, soundpool.load(this, R.raw.soundMusic2, 1));
soundMaps.put(3, soundpool.load(this, R.raw.soundMusic3, 1));
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
}
-
- @Override
- public void onClick(View view){
- // TODO Auto-generated method stub
- //判断哪个按钮单击
- switch(view.getId()){
- case R.id.button1:
- soundpool.play(soundMaps.get(1),1,1,0,0,1);
- break;
- case R.id.button2:
- soundpool.play(soundMaps.get(2),1,1,0,0,1);
- break;
- case R.id.button3:
- soundpool.play(soundMaps.get(3),1,1,0,0,1);
- break;
- }
- }
- }
SoundPool提供一个构造器,该构造器的可以指定她总共支持多少个声音文件、声音品质等,
SoundPool(int maxStream, int streamType,int srcQuality):maxStream指定支持声音文件的数量, streamType指定声音文件的类型,srcQuality指定声音的品质。
得到soundPool对象之后,接下来就可以调用SoundPoold的4个重载的load方法来加载声音文件,如下:int load(Context context, int resId, int priority)、int load(FileDescriptor fd, long offset, long length, int priority)、int load(AssetFileDescriptor afd, int priority)、load(String path, int priority)。
加载声音文件之后,都会返回该声音的ID,以后通过该声音的ID来播放指定声音,SoundPool提供播放声音的方法如下:int play(int soundId, float leftVolume,float rightVolume, int priority,int loop,float rate);
二、MediaPlayer的使用简介: