Android編程實(shí)現(xiàn)使用SoundPool播放音樂(lè)的方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)使用SoundPool播放音樂(lè)的方法。分享給大家供大家參考,具體如下:
如果應(yīng)用程序要播放密集、短促的音效,這時(shí)還用MediaPlayer就顯得不合適了。MediaPlayer存在如下缺點(diǎn):
1、資源占用率較高,延遲時(shí)間較長(zhǎng)
2、不支持多個(gè)音頻同時(shí)播放
此時(shí)我們可以用SoundPool來(lái)播放音效,SoundPool使用音效池的概念來(lái)管理多個(gè)短促的音效,例如它可以開(kāi)始就加載20個(gè)音效,以后在程序中按音效的ID進(jìn)行播放
SoundPool主要用于播放一些較短的聲音片段,優(yōu)勢(shì)在于CPU資源占用量低和反應(yīng)延遲較小。還支持自行設(shè)置聲音的品質(zhì)、音量、播放比率等參數(shù)。
SoundPool提供了一個(gè)構(gòu)造器,該構(gòu)造器可以指定它總共支持多少個(gè)聲音、聲音的品質(zhì)、
SoundPool(int maxStreams, int streamType,int srcQuality):第一個(gè)參數(shù)指定支持多少個(gè)聲音,第二個(gè)參數(shù)指定聲音的類(lèi)型,第三個(gè)參數(shù)指定聲音的品質(zhì)
一旦得到了SoundPool對(duì)象后,接下來(lái)就可調(diào)用SoundPool的多個(gè)重載的load方法來(lái)加載聲音了,
1、int load(Context context, int resId, int priority): 從resId所對(duì)應(yīng)的資源加載聲音
2、int load(FileDescript fd, long offset, long length, int priority):加載fd 所對(duì)應(yīng)的文件的offset開(kāi)始,長(zhǎng)度為length的聲音
3、int load(AssetFileDescriptior afd, int priority):從所對(duì)應(yīng)的文件中加載聲音
4、int load(String path, int priotity):從path對(duì)應(yīng)的文件中加載聲音
上面四個(gè)方法中都有一個(gè)priotity參數(shù),該參數(shù)目前還沒(méi)有任何作用,Android建議設(shè)為1,保持和未來(lái)的兼容性
上面四個(gè)方法加載聲音之后,都會(huì)返回改聲音的ID,以后程序就可以通過(guò)該聲音的ID來(lái)播放指定的聲音,SoundPool提供下面方法播放聲音:
int play(int sounded, float leftVolume,float rightVolume, int priotity, int loop, float rate):該方法的第一個(gè)參數(shù)指定播放哪個(gè)聲音,leftVolume,rightVolume指定左右的音量,priority指定播放聲音的優(yōu)先級(jí),數(shù)值越大,優(yōu)先級(jí)越高。Loop指定是否循環(huán),0為不循環(huán),-1為循環(huán);rate指定播放的比率,數(shù)值可以從0.5到2,1為正常比率
為了更好的管理SoundPool所加載的每一聲音ID,程序一般會(huì)使用一個(gè)HashMap<Integer,Integer>對(duì)象來(lái)管理聲音
歸納起來(lái),使用SoundPool播放聲音的步驟如下:
1、調(diào)用SoundPool的構(gòu)造器創(chuàng)建SoundPool的對(duì)象
2、調(diào)用SoundPool對(duì)象的load()方法從指定資源、文件中加載聲音。最好用HashMap<Integer,Integer>來(lái)管理所加載的聲音
3、調(diào)用SoundPool的play方法播放聲音
SoundPool存在問(wèn)題:
1. SoundPool最大只能申請(qǐng)1M的內(nèi)存空間,這就意味著我們只能使用一些很短的聲音片段,而不是用它來(lái)播放歌曲或者游戲背景音樂(lè)(背景音樂(lè)可以考慮使用JetPlayer來(lái)播放)。
2. SoundPool提供了pause和stop方法,但這些方法建議最好不要輕易使用,因?yàn)橛行r(shí)候它們可能會(huì)使你的程序莫名其妙的終止。還有些朋友反映它們不會(huì)立即中止播放聲音,而是把緩沖區(qū)里的數(shù)據(jù)播放完才會(huì)停下來(lái),也許會(huì)多播放一秒鐘。
3. 音頻格式建議使用OGG格式。在我的小游戲Agile Buddy中,我一開(kāi)始使用WAV格式的音頻文件存放游戲音效。經(jīng)過(guò)反復(fù)測(cè)試,在音效播放間隔較短的情況下會(huì)出現(xiàn)異常關(guān)閉的情況(有說(shuō)法是SoundPool目前只對(duì)16bit的WAV文件有較好的支持)。后來(lái)將文件轉(zhuǎn)成OGG格式,問(wèn)題得到了解決。
在此說(shuō)明一點(diǎn),使用SoudPool加載音樂(lè)的時(shí)候一般在onCreate()函數(shù)里面加載,要是在用到的時(shí)候加載,要設(shè)置監(jiān)聽(tīng)回調(diào)函數(shù)setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener),否則在播放的時(shí)候會(huì)沒(méi)有聲音
更多關(guān)于Android開(kāi)發(fā)相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android SoundPool實(shí)現(xiàn)簡(jiǎn)短小音效
- Android使用SoundPool播放短音效
- Android使用SoundPool實(shí)現(xiàn)播放音效
- Android使用SoundPool播放音效實(shí)例
- Android使用SoundPool實(shí)現(xiàn)播放音頻
- Android中SoundPool的使用步驟實(shí)例
- Android使用SoundPool播放音效
- Android多媒體應(yīng)用使用SoundPool播放音頻
- android使用SoundPool播放音效的方法
- Android利用SoundPool實(shí)現(xiàn)音樂(lè)池
相關(guān)文章
Android監(jiān)聽(tīng)手機(jī)電話狀態(tài)與發(fā)送郵件通知來(lái)電號(hào)碼的方法(基于PhoneStateListene實(shí)現(xiàn))
這篇文章主要介紹了Android監(jiān)聽(tīng)手機(jī)電話狀態(tài)與發(fā)送郵件通知來(lái)電號(hào)碼的方法,通過(guò)Android的PhoneStateListene實(shí)現(xiàn)該功能,需要的朋友可以參考下2016-01-01
Android中二維碼的掃描和生成(使用zxing庫(kù))
ZXing是一個(gè)開(kāi)放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫(kù),它包含了聯(lián)系到其他語(yǔ)言的端口,下面這篇文章主要給大家介紹了關(guān)于Android中二維碼掃描和生成的相關(guān)資料,主要使用的zxing庫(kù),需要的朋友可以參考下2022-09-09
Android中使用ScrollView實(shí)現(xiàn)滑動(dòng)到底部顯示加載更多
本文主要介紹了android利用ScrollView實(shí)現(xiàn)滑動(dòng)到底部顯示加載更多的示例代碼。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
使用 Lambda 取代 Android 中的匿名類(lèi)
本文主要介紹使用Lambda 取代 Android 中的匿名類(lèi)的資料,這里這里了相關(guān)資料及簡(jiǎn)單示例代碼幫助大家學(xué)習(xí)參考此部分的知識(shí),有需要的小伙伴可以參考下2016-09-09
Android+Flutter實(shí)現(xiàn)文字跑馬燈特效
跑馬燈常常被運(yùn)用在很多領(lǐng)域, 例如商場(chǎng)的電子條幅、大樓的宣傳廣告位、地鐵的廣告位。今天我們來(lái)說(shuō)一下flutter 怎么通過(guò)繪制來(lái)實(shí)現(xiàn)跑馬燈效果!,希望對(duì)大家有所幫助2022-11-11
Android開(kāi)發(fā)之Notification通知用法詳解
這篇文章主要介紹了Android開(kāi)發(fā)之Notification通知用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Notification通知的功能、參數(shù)、定義及使用方法,需要的朋友可以參考下2016-11-11
AndroidStudio Gradle基于友盟的多渠道打包方法
這篇文章主要介紹了AndroidStudio Gradle基于友盟的多渠道打包方法,需要的朋友可以參考下2017-09-09

