在開發(fā)android軟件中,經(jīng)常需要播放多媒體音頻文件,通常會(huì)采用MediaPlayer類來執(zhí)行此類操作。但MediaPlayer類占用的資源比較多,對(duì)于游戲等應(yīng)用而言,會(huì)帶來性能上的降低。在Android中,專門提供了SoundPool類來執(zhí)行此類音頻播放,SoundPool類占用的CPU資源較少、反應(yīng)較快。
SoundPool使用MediaPlaybackService將音頻流解碼為16位的PCM單聲道或者立體聲流。這有利于減小解碼造成的應(yīng)用延遲。
SoundPool的常用方法包括:
load() //加載音頻文件
pause() //暫停
play() //播放
resume() //恢復(fù)
setLoop() //設(shè)置循環(huán)模式
setOnLoadCompleteListener() //設(shè)置監(jiān)聽器
setVolume() //設(shè)置音量
setRate() //設(shè)置播放速率
SoundPool類和其他音頻播放類相比,可以自行設(shè)置音頻播放時(shí)的品質(zhì)、音量、播放速率等。并且它可以管理多個(gè)音頻流,每個(gè)流均擁有自己獨(dú)立的ID,對(duì)單個(gè)音頻流的管理均是通過其ID來進(jìn)行的。SoundPool類適用的場(chǎng)景包括應(yīng)用程序中的聲效(按鍵提示音、消息等)、游戲中密集而短暫的聲音(如多個(gè)飛船同時(shí)爆炸)。
SoundPool類的使用方法如下:
代碼10-5 SoundPool播放音頻的一般過程
int srcQuality=100;
int waitMsec=1000;
float leftVolume=SILENT;
float rightVolume=LOUD;
int priority=1;
int loop=0;
float rate=1f;
SoundPool mSoundPool=new SoundPool(SOUNDPOOL_STREAMS, AudioManager.STREAM_MUSIC, srcQuality);
int sampleId1=mSoundPool.load(mContext, SOUND_A, PRIORITY);
int streamID=mSoundPool.play(sampleID, leftVolume, rightVolume, priority, loop, rate);
……
下面是某個(gè)網(wǎng)站提供的一個(gè)實(shí)例: SoundPool在Activity中的集成
import android.media.AudioManager;
import android.media.SoundPool;
public class android123 extends Activity {
private SoundPool snd;
private int hitOkSfx;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
snd=new SoundPool(10, AudioManager.STREAM_SYSTEM,5);
hitOkSfx=snd.load(context, R.raw.ok, 0);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
snd.play(hitOkSfx, 1, 1, 0, 0, 1);
}
);
}
}
SoundPool通過setLoop(int streamID, int loop)方法可以設(shè)置播放模式,當(dāng)loop值為“-1”時(shí),播放模式為循環(huán)模式;當(dāng)loop值為“0”時(shí),播放模式為單次模式;當(dāng)loop值為一個(gè)正整數(shù)時(shí),loop值意味著可以播放的次數(shù)。
SoundPool通過setRate(int streamID, float rate)方法可以設(shè)置播放速率,其范圍為0.5~2.0。當(dāng)rate值為2.0時(shí),意味著當(dāng)前播放速率是原始速率的2倍,處于快進(jìn)模式。
SoundPool通過setVolume(int streamID,float leftVolume, float rightVolume)方法可以設(shè)置音頻流的音量范圍。
另外,通過play()方法,SoundPool可以一次性設(shè)置播放模式、播放速率、音量范圍等。
需要注意的是,SoundPool目前存在著一些局限,如大只能申請(qǐng)1MB的內(nèi)存空間等,另SoundPool提供了pause()和stop()方法,但這些方法目前存在一些Bug,建議不要輕易使用。SoundPool還存在著一些效率問題。