上個月使用了一次SoundPool用來仿一款背單詞app,最近突然想起來,還是趁現在記得,趕緊記下來
1.首先先創建一個SoundPool的實例:
SoundPool soundPool = new SoundPool.Builder().setMaxStreams(1).build();
//.setMaxStreams(1)代表最大可同時播放幾個音頻流,我這設置的是1
//還有個.setAudioAttributes(xxx)方法,說實話我也不知道有什么鳥用,網上也查不到,反正我沒設置它
2.加載音頻資源
soundPool.load(wordFile.toString(), 1); //從文件加載音頻
//第一個參數是文件的位置,用字符串表示
//第二個參數我就日了狗了,官方文檔中注明: the priority of the sound. Currently has no effect.Use a value of 1 for future compatibility.
//媽的,沒用你特么設計這個參數干毛!,不管怎么樣,我們傳入1就好
public int load(Context context, int resId, int priority) //這個是從資源文件中加載音頻,我沒使用,看起來蠻簡單的
3.播放音頻文件
public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
//第一個參數soundID 就是我們加載完文件(load方法)時返回的int型數字,必須填加載過的數字
//第二個參數leftVolume 左聲道音量
//第三個參數rightVolume 右聲道音量
//第四個參數priority 播放聲音的優先級
//第五個參數loop 聲音重復的次數, 0代表不循環, -1代表無限循環
//第六個參數rate 聲音播放的速度, 1.0代表正常速度, 取值范圍為0.5~2.0 //這個不錯哦
//返回值 如果是個非0的值代表播放成功,如果0代表播放失敗
/** 翻譯下這個方法的部分官方說明:
* | 播放指定soundID的聲音,這個soundID是load()方法返回的值
* | play()方法返回值如果是非0的值表示播放成功,如果是0表示失敗,這個值可以用做重放
* | 注意: 如果正在播放的聲音數超過了播放的最大限制數,使用play()方法可能造成另一個聲音被停止
* |
* | loop值如果為0表示只播放一次,如果-1表示無限重復,如果是其他值表示重復的次數
* | 例如: loop = 0, 正常播放1次, 重復0次, 總共播放一次
* | loop = 1, 正常播放1次, 重復1次, 總共播放2次
* | loop = 99, 正常播放1次, 重復99次, 總共播放100次
*/
4.釋放資源
(1)釋放指定資源:
public native final boolean unload(int soundID);
//指定soundID的聲音資源將不能再使用
(2)釋放所有資源:
public final void release()
//釋放加載的所有資源,釋放后就不能再播放了,而且應該將SoundPool的引用設為null
5.使用心得:
我想了想還是有必要要傳授給大家一點人生經驗
1.如果加載的資源太多了,超過了SoundPool的內存限制(具體多少我不是很清楚,但網上都說是1M),那么最先加載的資源將不再可用. 就像一個隊列的數據結構一樣,先進先出.
2.如果資源文件不多,但需要重復播放
//這種情況可以用一個map將load()得到的soundID保存下來,以便下次使用,例如:
Map<String, Integer> map = new HashMap()
int soundID = soundPool.load(wordFile.toString(), 1);
String key = "打飛機的聲音"
map.put(key, soundID);
//這樣可以重復利用已經加載過的聲音資源
3.如果資源很多,每個聲音播放的次數很少
//這種情況換句話說就是,每個資源加載一次就不再使用了,那么只需要在加載的時候播放就行
使用SoundPool.OnLoadCompleteListener,在加載成功后的回調中播放就行
/**
* Called when a sound has completed loading.
*
* @param soundPool SoundPool object from the load() method
* @param sampleId the sample ID of the sound loaded.
* @param status the status of the load operation (0 = success)
*/
public void onLoadComplete(SoundPool soundPool, int sampleId, int status);
//上面的參數中sampleId,就是加載資源的soundID.
//在這個方法中使用play()方法就行
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
soundPool.play(sampleId, 1, 1, 1, 0, 1);
}
以上