歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android開發:使用SoundPool播放音樂

如果應用程序要播放密集、短促的音效,這時還用MediaPlayer就顯得不合適了。MediaPlayer存在如下缺點:

1、  資源占用率較高,延遲時間較長

2、  不支持多個音頻同時播放

此時我們可以用SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效,例如它可以開始就加載20個音效,以後在程序中按音效的ID進行播放

SoundPool主要用於播放一些較短的聲音片段,優勢在於CPU資源占用量低和反應延遲較小。還支持自行設置聲音的品質、音量、播放比率等參數。

SoundPool提供了一個構造器,該構造器可以指定它總共支持多少個聲音、聲音的品質、

SoundPool(int maxStreams, int streamType,int srcQuality):第一個參數指定支持多少個聲音,第二個參數指定聲音的類型,第三個參數指定聲音的品質

一旦得到了SoundPool對象後,接下來就可調用SoundPool的多個重載的load方法來加載聲音了,

1、  int load(Context context, int resId, int priority): 從resId所對應的資源加載聲音

2、  int load(FileDescript fd, long offset, long length, int priority):加載fd 所對應的文件的offset開始,長度為length的聲音

3、  int load(AssetFileDescriptior afd, int priority):從所對應的文件中加載聲音

4、  int load(String path, int priotity):從path對應的文件中加載聲音

上面四個方法中都有一個priotity參數,該參數目前還沒有任何作用,Android建議設為1,保持和未來的兼容性

上面四個方法加載聲音之後,都會返回改聲音的ID,以後程序就可以通過該聲音的ID來播放指定的聲音,SoundPool提供下面方法播放聲音:

int play(int sounded, float leftVolume,float rightVolume, int priotity, int loop, float rate):該方法的第一個參數指定播放哪個聲音,leftVolume,rightVolume指定左右的音量,priority指定播放聲音的優先級,數值越大,優先級越高。Loop指定是否循環,0為不循環,-1為循環;rate指定播放的比率,數值可以從0.5到2,1為正常比率

為了更好的管理SoundPool所加載的每一聲音ID,程序一般會使用一個HashMap<Integer,Integer>對象來管理聲音

歸納起來,使用SoundPool播放聲音的步驟如下:

1、  調用SoundPool的構造器創建SoundPool的對象

2、  調用SoundPool對象的load()方法從指定資源、文件中加載聲音。最好用HashMap<Integer,Integer>來管理所加載的聲音

3、  調用SoundPool的play方法播放聲音

SoundPool存在問題:

1. SoundPool最大只能申請1M的內存空間,這就意味著我們只能使用一些很短的聲音片段,而不是用它來播放歌曲或者游戲背景音樂(背景音樂可以考慮使用JetPlayer來播放)。

2. SoundPool提供了pause和stop方法,但這些方法建議最好不要輕易使用,因為有些時候它們可能會使你的程序莫名其妙的終止。還有些朋友反映它們不會立即中止播放聲音,而是把緩沖區裡的數據播放完才會停下來,也許會多播放一秒鐘。

3. 音頻格式建議使用OGG格式。在我的小游戲Agile Buddy中,我一開始使用WAV格式的音頻文件存放游戲音效。經過反復測試,在音效播放間隔較短的情況下會出現異常關閉的情況(有說法是SoundPool目前只對16bit的WAV文件有較好的支持)。後來將文件轉成OGG格式,問題得到了解決。

在此說明一點,使用SoudPool加載音樂的時候一般在onCreate()函數裡面加載,要是在用到的時候加載,要設置監聽回調函數setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener),否則在播放的時候會沒有聲音。

Copyright © Linux教程網 All Rights Reserved