使用SoundPool記錄

上個月使用了一次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);
}

以上

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容