前言
最近新接觸的項(xiàng)目中有一個(gè)業(yè)務(wù)功能是語(yǔ)音播報(bào)业踏,所以有接觸到了SoulPool這個(gè)類,寫個(gè)文章記錄一下~
如果項(xiàng)目業(yè)務(wù)功能中需要播放簡(jiǎn)短的音頻的話消略,可以使用SoundPool 堡称。SoundPool?是 Android 提供的一個(gè)API類,用來(lái)播放簡(jiǎn)短音頻的艺演,使用起來(lái)簡(jiǎn)單并且功能強(qiáng)大。
SoundPool 除了可以完成音頻的播放、暫停胎撤、恢復(fù)及停止的操作外晓殊,還可以調(diào)節(jié)左右聲道的音量值、調(diào)整播放的語(yǔ)速伤提、設(shè)置播放的優(yōu)先級(jí)以及播放的次數(shù)等等巫俺。
創(chuàng)建SoulPool
SoundPool 的創(chuàng)建方式在Android 5.0 以前是直接使用SoundPool 的構(gòu)建方法即可,在Android5.0之后肿男,則是使用Builder模式來(lái)創(chuàng)建介汹。為了更好的兼容性,我們可以判斷一下api版本進(jìn)行對(duì)應(yīng)的創(chuàng)建舶沛。
Android5.0之前SoundPool 的構(gòu)造函數(shù)有三個(gè)參數(shù)分別是maxStreams嘹承、streamType和srcQuality。
maxStreams:同時(shí)播放流的最大數(shù)量如庭,當(dāng)播放的流大于此設(shè)置值時(shí)叹卷,則會(huì)選擇性停止優(yōu)先級(jí)較低的流;
streamType:流類型坪它,例如STREAM_MUSIC骤竹、STREAM_ALARM、STREAM_NOTIFICATION等往毡;
srcQuality:采樣率轉(zhuǎn)換器質(zhì)量蒙揣,很少用得上,默認(rèn)設(shè)置0即可开瞭;
Android5.0 之后懒震,使用Builder模式進(jìn)行構(gòu)造,可以設(shè)置多個(gè)參數(shù)惩阶。我這里放兩張?jiān)创a截圖挎狸,如果需要詳細(xì)了解的,可以自己點(diǎn)進(jìn)去追蹤一下~
SoundPool.Builder中setMaxStreams和之前Android5.0SoundPool的構(gòu)造函數(shù)maxStreams參數(shù)相同断楷。SoundPool.Builder中setAudioAttributes用來(lái)設(shè)置audio 屬性锨匆,此值要么不設(shè),要么設(shè)置不為null的值冬筒,否則會(huì)導(dǎo)致異常產(chǎn)生恐锣。
音頻資源的加載與播放
首先我們要進(jìn)行音頻資源的加載,加載成功之后舞痰,才能進(jìn)行播放土榴。加載音頻,我們可以使用SoulPool實(shí)例中的load方法响牛。
加載音頻資源時(shí)異步執(zhí)行的玷禽,此過(guò)程需要時(shí)間赫段,所以我們可以使用SoulPool中的OnLoadCompleteListener接口進(jìn)行監(jiān)聽(tīng),其中的onLoadComplete方法則是在音頻資源加載完成后調(diào)用矢赁。
我們還可以通過(guò)SoulPool中的unload方法糯笙,卸載之前加載過(guò)的資源。
其實(shí)撩银,只要我們點(diǎn)進(jìn)去SoulPool類中给涕,就能看見(jiàn)它提供的所有方法了,如上圖额获。
音頻播放够庙,我們是使用到了SoulPool實(shí)例中的play方法,該方法要傳比較多的參數(shù)抄邀,分別是soundID耘眨、leftVolume、rightVolume撤摸、priority毅桃、loop和rate,它們分別代表的意思是:
soundID:是SoulPool加載資源load方法返回的值准夷,指向某個(gè)已加載的音頻資源钥飞;
leftVolume和rightVolume:分別代表左聲道和右聲道的值,設(shè)置范圍在0f ~ 1f衫嵌;
priority:則是流的優(yōu)先級(jí)读宙;
loop:是循環(huán)播放的次數(shù), 例如-1是表示無(wú)限循環(huán);
rate:則是播放的速率 楔绞,1是正常速率结闸,如果設(shè)置2則表示2倍速率;
play方法返回的streamID酒朵,若返回0則播放失敗桦锄,其它值都代表播放成功。
圖中方法還有pause蔫耽、resume结耀、stop分別代表暫停音播放、恢復(fù)音頻播放和停止音頻播放匙铡。SoulPool提供的方法图甜,源碼中都有,這里就不一一細(xì)說(shuō)了鳖眼。記得黑毅!一定要釋放資源(release)
注意事項(xiàng)
1.SoulPool并不是什么格式的音頻資源都支持的,MP3這些常見(jiàn)的格式當(dāng)然是支持的钦讳,如果有別的格式的音頻可以自己測(cè)試一下矿瘦;
2.SoulPool是Android為了播放簡(jiǎn)短音頻提供的api枕面,所以盡量不要播放時(shí)間過(guò)長(zhǎng)的音頻;
3.設(shè)置播放流的優(yōu)先級(jí)的問(wèn)題匪凡,如果同時(shí)播放的活動(dòng)流的數(shù)目超過(guò)設(shè)置的maxStreams時(shí)膊畴,會(huì)根據(jù)優(yōu)先級(jí)來(lái)停止優(yōu)先級(jí)較低的流掘猿;如果有多個(gè)具有相同低優(yōu)先級(jí)的流病游,它將選擇要停止的最舊流,并且該流不再有效稠通;如果要播放的流的優(yōu)先級(jí)最低衬衬,則會(huì)播放失敗。
4.加載音頻資源的數(shù)量限制也注意一下改橘,別加載過(guò)多滋尉。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2021年9月15日程序猿小鐘帶著【播放簡(jiǎn)短音頻類-SoulPool】到此一游~