標籤:string getc offset 管理 開始 詳解 oat http 之間
使用SoundPool播放音效
如果應用程式經常播放密集、急促而又短暫的音效(如遊戲音效)那麼使用MediaPlayer顯得有些不太適合了。因為MediaPlayer存在如下缺點:
1) 延時時間較長,且資源佔用率高。
2) 不支援多個音頻同時播放。
Android中除了MediaPlayer播放音頻之外還提供了SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效,例如它可以開始就載入20個音效,以後在程式中按音效的ID進行播放。
SoundPool主要用於播放一些較短的聲音片段,與MediaPlayer相比,SoundPool的優勢在於CPU資源佔用量低和反應延遲小。另外,SoundPool還支援自行設定聲音的品質、音量、 播放比率等參數。
SoundPool提供了一個構造器,該構造器可以指定它總共支援多少個聲音(也就是池的大小)、聲音的品質
構造器如下:
SoundPool(int maxStreams, int streamType, int srcQuality):第一個參數指定支援多少個聲音;第二個參數指定聲音類型:第三個參數指定聲音品質。
int maxStreams:在聲音池中允許同時存在的聲音數量。當池子中的聲音超過這個數量時,優先順序(後面會提到)最低、或者最早(Oldest,原諒我可憐的翻譯水平)放進池中的,將被移除。這個數值不是越大越好,因為越大也就意味著,Android會給你預分配一個更大的空間,如果不需要使用會造成浪費。
int streamType:聲音流的類型,有STREAM_RING、STREAM_MUSIC等等,一般都是使用後者,即AudioManager.STREAM_MUSIC。
int srcQuality:官網解釋為“採樣速率轉化器的品質”(再次原諒我的翻譯),這個參數目前沒有什麼實際意義(可能還沒實現這個功能),所以設定什麼數值都無所謂,官方建議用0;
例:
public SoundPool luozisound = new SoundPool(5, AudioManager.STREAM_SYSTEM, 0);
一旦得到了SoundPool對象之後,接下來就可調用SoundPool的多個重載的load方法來載入聲音了。
SoundPool提供了如下4個load方法:
int load(Context context, int resld, int priority):從 resld 所對應的資源載入聲音
int load(FileDescriptor fd, long offset, long length, int priority):載入 fd 所對應的檔案的offset開始、長度為length的聲音
int load(AssetFileDescriptor afd, int priority):從afd 所對應的檔案中載入聲音
int load(String path, int priority):從path 對應的檔案去載入聲音
上面4個方法中都有一個priority參數,該參數目前還沒有任何作用,Android建議將該 參數設為1,保持和未來的相容性。
一般來說用第一個,
Context context:這個不必多解釋,一般都是設定為getApplicationContext()擷取
int resId:想要載入的音效資源ID,我用的是R.raw.XXX
int priority:音效播放時的優先順序,官方解釋這個參數在這個方法中不起作用,建議用1暫時代替
例:
luozisound.load(getContext(), R.raw.luozi, 1);//載入音效檔案資源
上面4個方法載入聲音之後,都會返回該聲音的的ID,以後程式就可以通過該聲音的ID 來播放指定聲音。
SoundPool提供的播放指定聲音的方法:
int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate);
soundID指定播放哪個聲音;
float leftVolume:左聲道音量大小,這是一個相對值,大小在0.0f - 1.0f之間,具體計算方法為:你想要的聲音大小 / 最大音量,比如取值0.8f表示最大音量的80%
float rightVolume:右聲道音量大小,具體如上
int priority:優先順序,值越大優先順序越高,0的優先順序最低。之前在第3步中也有一個優先順序參數,但是那裡無效,而現在這裡的這個參數是正兒八經有效果的。
int loop:是否需要迴圈播放,取值不限。其中負數表示無窮迴圈(官方建議,如果無窮迴圈,用-1,當然-2、-3等也行),非負數表示迴圈次數,比如0表示迴圈0次,也就是播放一次就不再迴圈了,總共就只播放一次;1則表示迴圈1次(總共播放2次)。
float rate:這個參數有點意思,可以理解為播放速率(就是快進、快退啥的),取值0.5f - 2.0f,其中0.5表示播放速度為正常的0.5倍。1表示正常速率播放
例:
luozisound.play(1,1, 1, 0, 0, 1);
在load聲音資源後,並不能立即調用play,否則無法播放聲音,因為聲音資源還沒載入完成,應該給足夠時間讓它載入完成,比如在onCreate中load,在onclick中play
為了更好地管理SoundPool所載入的每個聲音的1D,程式一般會使用一個HashMap對象來管理聲音。
HashMap用到,我在補充
Android開發之SoundPool使用詳解