[android] SoundPool詳解
今天做一個小Demo用到了SoundPool,總結一下。
MediaPlayer缺點:不能重疊播放音樂,封裝程度比較高,所以載入起來會比較慢。
SoundPool簡介
Android系統提供了另一種播放音效的類。用來載入多個音效,短促音效和多個短促音效,可自行設定聲音品質,音量,重複和優先順序。在一定場合還是很好用的。
屬於android.media包下,繼承自Object。
構造方法public SoundPool(int maxStreams, int streamType, int srcQuality) {...} 參數一 maxStreams:支援多少個聲音(也就是池的大小) 參數二 streamType:指定聲音類型通過AudioManager擷取對應的常量值。 參數三 srcQuality:採樣率變換品質,沒用到。預設是0,沒查到資料。。
SoundPool pool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
指定了該池最多指定三個音頻,使用用於系統聲音的音頻流。於AudioManager參數有很多,可以戳---> AudioManager。
載入資料
有四個構造方法:
public int load(String path, int priority) 從完整檔案路徑名載入
path:檔案路徑
priority:優先順序,0的優先順序最低 傳回值:這個聲音的ID,用於開啟和關閉音樂。 public int load(AssetFileDescriptor afd, int priority)
從Asset對象載入 afd:一個assets檔案中的描述器,可以獲得assets下檔案的資訊; priority: 傳回值: public int load(Context context, int resId, int priority) 從APK資源擷取
context: resId:檔案的ID(res檔案夾裡的檔案才有id) priority: public int load(FileDescriptor fd, long offset, long length, int priority) 從FileDescriptor對象載入
fd:檔案描述類的執行個體 offset:從音效檔開始的位移量(從什麼地方播放) length:聲音長度 priority:播放構造方法: public final int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate) 參數一 soundID:所播放的聲音ID,是load方法返回的 參數二 leftVolume:左音量,值從(0.0-1.0) 參數三 rightVolume:右音量,值從(0.0-1.0) 參數四 priority:優先順序,0的優先順序最低。 參數五 loop:是否迴圈,0不迴圈,-1一直迴圈。 參數六 rate:播放速率,1為正常速率。範圍從0.5-2。
如果需要播放多首:需要一個集合來儲存音訊ID,就是上面load方法返回的int。 如果指定播放一首:就不用建集合了,假設音頻位於
//擷取資源
AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.music)
//載入音頻int soundID = pool.load(fd, 1);
//播放音頻,soundID是上面的傳回值pool.play(soundID, 1, 1, 0, 0, 1);
這樣完成了一首音訊播放。 最後一個問題:播放多首音頻。
聲明一個集合存放音頻 HashMap soundMap = new HashMap();
soundMap.put(1, pool.load(this, R.raw.music1, 1));
soundMap.put(2, pool.load(this, R.raw.music2, 1));
soundMap.put(3, pool.load(this, R.raw.music3, 1));
存放三個音頻; pool.play(soundMap.get(1), 1, 1, 0, 0, 1);
pool.play(soundMap.get(2), 1, 1, 0, 0, 1);
pool.play(soundMap.get(3), 1, 1, 0, 0, 1);
這樣就完成多首音訊播放
釋放資源及其他
release()方法釋放所有SoundPool對象佔據的記憶體和資源。
pause(soundID)暫停播放
stop(soundID)停止播放
......