SoundPool使用隨筆

基本概念

最近在做一個音樂相關(guān)的項目,對音樂的播放的基本操作是免不了的瑟由,作為android 小白的我來說第一時間想到了使用MediaPlayer來實現(xiàn)絮重。

SoundPool 顧名思義是聲音的池子〈蹩啵看看下面SoundPool官方文檔的解釋:

<!--soundpool 用來管理和播放音頻文件的-->
The SoundPool class manages and plays audio resources for applications.

A SoundPool is a collection of samples that can be loaded into memory 
from a resource inside the APK or from a file in the file system.

SoundPool 與 MediaPlayer

為什么他們要用SoundPool 而不用MediaPlayer? 它們有什么區(qū)別呢青伤?

為了以后就不用對著英文翻譯,就把整個SoundPool文檔翻譯了一下:

除了低延遲播放之外殴瘦,SoundPool還可以管理一次渲染的音頻流數(shù)量狠角。當構(gòu)建SoundPool對象時,maxStreams參數(shù)設(shè)置可從此單個SoundPool一次播放的最大流數(shù)痴施。 SoundPool跟蹤活動流的數(shù)量擎厢。如果超過了最大數(shù)量的數(shù)據(jù)流究流,SoundPool會根據(jù)優(yōu)先級自動停止先前播放的數(shù)據(jù)流辣吃,然后根據(jù)該優(yōu)先級按年齡自動停止动遭。限制數(shù)據(jù)流的最大數(shù)量有助于限制CPU負載,并減少混音會影響視覺效果或UI性能的可能性神得。

聲音可以通過設(shè)置非零循環(huán)值來循環(huán)厘惦。值為-1會導(dǎo)致聲音永久循環(huán)。在這種情況下哩簿,應(yīng)用程序必須顯式調(diào)用stop()函數(shù)來停止聲音宵蕉。任何其他非零值將導(dǎo)致聲音重復(fù)指定的次數(shù),例如节榜,值為3會導(dǎo)致聲音總共播放4次羡玛。

播放速率也可以改變。 1.0的播放速率會導(dǎo)致聲音以其原始頻率播放(如果需要宗苍,重新采樣至硬件輸出頻率)稼稿。 2.0的播放速率會使聲音以原始頻率的兩倍播放,0.5的播放速度會使其以原始頻率的一半播放讳窟。播放速率范圍是0.5到2.0吕朵。

優(yōu)先級從低到高嗜诀,即數(shù)字越大,優(yōu)先級越高。當創(chuàng)建SoundPool時哮塞,對play()的調(diào)用會導(dǎo)致活動流的數(shù)量超過maxStreams參數(shù)所設(shè)置的值時使用優(yōu)先級。在這種情況下匾七,流分配器將停止最低優(yōu)先級的流赦邻。如果有多個具有相同低優(yōu)先級的流,它將選擇最舊的流停止坑雅。在新流的優(yōu)先級低于所有活動流的情況下辈挂,新的聲音將不會播放,并且play()函數(shù)將返回0的流ID霞丧。

讓我們來看一個典型的用例:一個游戲包含多個層次的游戲呢岗。對于每個級別,都有一組只有該級別使用的獨特聲音蛹尝。在這種情況下后豫,游戲邏輯應(yīng)該在第一級加載時創(chuàng)建一個新的SoundPool對象。關(guān)卡數(shù)據(jù)本身可能包含此關(guān)卡使用的聲音列表突那。加載邏輯遍歷調(diào)用相應(yīng)SoundPool.load()函數(shù)的聲音列表挫酿。這通常應(yīng)該在流程的早期完成,以便在需要播放之前有時間將音頻解壓為原始PCM格式愕难。

一旦聲音加載并開始播放早龟,應(yīng)用程序可以通過調(diào)用SoundPool.play()來觸發(fā)聲音惫霸。播放流可以暫停或恢復(fù)葱弟,應(yīng)用程序還可以通過實時調(diào)整播放速率來改變音高壹店,以獲得多普勒效應(yīng)或綜合效果。

請注意芝加,由于流可因資源限制而停止硅卢,因此streamID是對流的特定實例的引用。如果流停止以允許播放更高優(yōu)先級的流藏杖,則流不再有效将塑。但是,應(yīng)用程序可以無錯地調(diào)用streamID上的方法蝌麸。這可能有助于簡化程序邏輯点寥,因為應(yīng)用程序不需要關(guān)注流生命周期。

在我們的例子中来吩,當玩家完成關(guān)卡時敢辩,游戲邏輯應(yīng)該調(diào)用SoundPool.release()來釋放所有正在使用的本地資源,然后將SoundPool參考設(shè)置為null误褪。如果玩家開始另一個關(guān)卡责鳍,則會創(chuàng)建一個新的SoundPool,聲音會被載入兽间,然后重新開始播放历葛。

SoundPool文檔中,以及小白對MediaPlayer 之前的簡單使用嘀略,總結(jié)了亮點:

  • soundPool 相比MediaPlayer 播放延時更低恤溶;

  • soundPool 適用于播放聲音短促的音樂文件(10s以內(nèi)的)

  • 支持多個音頻同時播放

基本使用

  • 構(gòu)造方法

SoundPool (int maxStreams,  int streamType, int srcQuality)
//maxStreams 設(shè)置soundpool對象的并發(fā)流的最大數(shù)量
//streamType 設(shè)置流的類型,一般為STREAM_MUSIC
//srcQuality 采樣轉(zhuǎn)換率的質(zhì)量  現(xiàn)在沒有什么效果 0 設(shè)為默認

但在上面的構(gòu)造方法在api 21 被廢棄了帜羊。API 21 以后使用SoundPool.Builder創(chuàng)建soundpool對象實例:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            mSoundPool = new SoundPool.Builder()
                    .setMaxStreams(maxSteams)
                    .build();
        } else {
            mSoundPool = new SoundPool(maxSteams, AudioManager.STREAM_MUSIC, 0);
        }
  • 常用方法

    加載音頻文件

與MediaPlayer相同 SoundPool 加載音頻文件有多種方式

<!--加載應(yīng)用資源文件--> 注意:切忌使用文件名相同咒程,格式名不同的文件example.mp3  ,example.wav
int load(Context context, int resId, int priority)

<!--從音頻文件路徑加載-->
int load(String path, int priority)

<!--從asset 文件中加載-->
int load(AssetFileDescriptor afd, int priority)

<!--從文件中加載-->
int load(FileDescriptor fd, long offset, long length, int priority)

上述方法加載音頻返回一個sound ID. 這個ID就是用來播放對應(yīng)加載音樂文件以及相應(yīng)操作的標識。

控制播放等一些其他設(shè)置


stop(int streamID)

pause(int streamID)

resume(int streamID)

release()

<!--設(shè)置循環(huán)播放  (0 不循環(huán), -1 循環(huán))-->
setLoop(int streamID, int loop)

<!--設(shè)置有播放優(yōu)先級-->
setPriority(int streamID, int priority)

<!--設(shè)置播放播放速度 rate值 0.5 ~2.0 之間--> 
setRate(int streamID, float rate)

setVolume(int streamID, float leftVolume, float rightVolume)

<!--相對于load方法-->
unload(int soundID)

<!--此方法會遍歷所有正在播放的音樂  并設(shè)置flag 讼育,在autoResume的時候恢復(fù)播放-->
autoPause()
autoResume()

監(jiān)聽

setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener)

SoundPool 使用起來還是很簡單的帐姻。還是想總結(jié)一下做個筆記。

每天都有進步奶段。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饥瓷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痹籍,更是在濱河造成了極大的恐慌呢铆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹲缠,死亡現(xiàn)場離奇詭異棺克,居然都是意外死亡悠垛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門娜谊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來确买,“玉大人,你說我怎么就攤上這事因俐∧赐铮” “怎么了周偎?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵抹剩,是天一觀的道長。 經(jīng)常有香客問我蓉坎,道長澳眷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任蛉艾,我火速辦了婚禮钳踊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勿侯。我一直安慰自己拓瞪,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布助琐。 她就那樣靜靜地躺著祭埂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兵钮。 梳的紋絲不亂的頭發(fā)上蛆橡,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音掘譬,去河邊找鬼泰演。 笑死,一個胖子當著我的面吹牛葱轩,可吹牛的內(nèi)容都是我干的睦焕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼靴拱,長吁一口氣:“原來是場噩夢啊……” “哼垃喊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缭嫡,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缔御,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妇蛀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耕突,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡笤成,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眷茁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕泳。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖上祈,靈堂內(nèi)的尸體忽然破棺而出培遵,到底是詐尸還是另有隱情,我是刑警寧澤登刺,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布籽腕,位于F島的核電站,受9級特大地震影響纸俭,放射性物質(zhì)發(fā)生泄漏皇耗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一揍很、第九天 我趴在偏房一處隱蔽的房頂上張望郎楼。 院中可真熱鬧,春花似錦窒悔、人聲如沸呜袁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阶界。三九已至,卻和暖如春北救,著一層夾襖步出監(jiān)牢的瞬間荐操,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工珍策, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留托启,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓攘宙,卻偏偏與公主長得像屯耸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹭劈,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容