怎么在android中利用SoundPool播放音頻?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)建站專注于湞江網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供湞江營銷型網(wǎng)站建設(shè),湞江網(wǎng)站制作、湞江網(wǎng)頁設(shè)計(jì)、湞江網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造湞江網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供湞江網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
SoundPool(android.media.SoundPool),顧名思義是聲音池的意思,主要用于播放一些較短的聲音片段,支持從程序的資源或文件系統(tǒng)加載。與MediaPlayer相比,SoundPool的優(yōu)勢在于CPU資源占用量低和反應(yīng)延遲小。另外,SoundPool還支持自行設(shè)置聲音的品質(zhì)、音量、播放比率等參數(shù),支持通過ID對多個音頻流進(jìn)行管理。
1. SoundPool最大只能申請1M的內(nèi)存空間,這就意味著我們只能用一些很短的聲音片段,而不是用它來播放歌曲或者做游戲背景音樂。
2. SoundPool提供了pause和stop方法,但這些方法建議最好不要輕易使用,因?yàn)橛行r候它們可能會使你的程序莫名其妙的終止。建議使用這兩個方法的時候盡可能多做測試工作,還有些朋友反映它們不會立即中止播放聲音,而是把緩沖區(qū)里的數(shù)據(jù)播放完才會停下來,也許會多播放一秒鐘。
3. SoundPool的效率問題。其實(shí)SoundPool的效率在這些播放類中算是很好的了,但是有的朋友在G1中測試它還是有100ms左右的延遲,這可能會影響用戶體驗(yàn)。也許這不能管SoundPool本身,因?yàn)榈搅诵阅鼙容^好的Droid中這個延遲就可以讓人接受了。
在現(xiàn)階段SoundPool有這些缺陷,但也有著它不可替代的優(yōu)點(diǎn),基于這些我們建議大在如下情況中多使用SoundPool:1.應(yīng)用程序中的聲效(按鍵提示音,消息等)2.游戲中密集而短暫的聲音(如多個飛船同時爆炸)
1.相關(guān)方法介紹:
1)構(gòu)造方法:
SoundPool(int maxStreams, int streamType, int srcQuality) 參數(shù)依次是:
①指定支持多少個聲音,SoundPool對象中允許同時存在的最大流的數(shù)量。
②指定聲音類型,流類型可以分為STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和 STREAM_ALARM四種類型。在AudioManager中定義。
③指定聲音品質(zhì)(采樣率變換質(zhì)量),一般直接設(shè)置為0!
在低版本中可以用上述構(gòu)造方法,而API 21(Android 5.0)后這個構(gòu)造方法就過時了! 而用到一個SoundPool.Builder的東東,我們要實(shí)例化SoundPool只需調(diào)用:
SoundPool.Builder spb = new SoundPool.Builder(); spb.setMaxStreams(10); spb.setAudioAttributes(null); //轉(zhuǎn)換音頻格式 SoundPool sp = spb.build(); //創(chuàng)建SoundPool對象
要使用上述代碼的話,TargetSDK版本要設(shè)置大于等于21哦!而且如果minSDK版本小于21 會出現(xiàn)下面的提醒:
2)常用方法介紹:
①加載聲音資源:
load(Context context, int resId, int priority)
load(String path, int priority)
load(FileDescriptor fd, long offset, long length, int priority)
load(AssetFileDescriptor afd, int priority) 上述方法都會返回一個聲音的ID,后面我們可以通過這個ID來播放指定的聲音
參數(shù)介紹:
context:上下文
resId:資源id
priority:沒什么用的一個參數(shù),建議設(shè)置為1,保持和未來的兼容性
path:文件路徑
FileDescriptor:貌似是流吧,這個我也不知道
AssetFileDescriptor:從asset目錄讀取某個資源文件,用法:
AssetFileDescriptor descriptor = assetManager.openFd("biaobiao.mp3");
②播放控制:
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
參數(shù)依次是:
soundID:Load()返回的聲音ID號
leftVolume:左聲道音量設(shè)置
rightVolume:右聲道音量設(shè)置
priority:指定播放聲音的優(yōu)先級,數(shù)值越高,優(yōu)先級越大。
loop:指定是否循環(huán):-1表示無限循環(huán),0表示不循環(huán),其他值表示要重復(fù)播放的次數(shù)
rate:指定播放速率:1.0的播放率可以使聲音按照其原始頻率,而2.0的播放速率,可以使聲音按照其 原始頻率的兩倍播放。如果為0.5的播放率,則播放速率是原始頻率的一半。播放速率的取值范圍是0.5至2.0。
③資源釋放:
可以調(diào)用release()方法釋放所有SoundPool對象占據(jù)的內(nèi)存和資源,當(dāng)然也可以根據(jù)聲音 ID來釋放!
3.使用代碼示例:
運(yùn)行效果圖:
當(dāng)點(diǎn)擊按鈕的時候會,"Duang"一下,這里演示了兩種load的方法,分別是raw和assests!
關(guān)鍵代碼:
MainActivity.java:
private void initSP() throws Exception{ //設(shè)置最多可容納5個音頻流,音頻的品質(zhì)為5 mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5); soundID.put(1, mSoundPool.load(this, R.raw.duang, 1)); soundID.put(2 , mSoundPool.load(getAssets().openFd("biaobiao.mp3") , 1)); //需要捕獲IO異常 soundID.put(3, mSoundPool.load(this, R.raw.duang, 1)); soundID.put(4, mSoundPool.load(this, R.raw.duang, 1)); soundID.put(5, mSoundPool.load(this, R.raw.duang, 1)); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_play1: mSoundPool.play(soundID.get(1), 1, 1, 0, 0, 1); break; case R.id.btn_play2: mSoundPool.play(soundID.get(2), 1, 1, 0, 0, 1); break; case R.id.btn_play3: mSoundPool.play(soundID.get(3), 1, 1, 0, 0, 1); break; case R.id.btn_play4: mSoundPool.play(soundID.get(4), 1, 1, 0, 0, 1); break; case R.id.btn_play5: mSoundPool.play(soundID.get(5), 1, 1, 0, 0, 1); break; case R.id.btn_release: mSoundPool.release(); //回收SoundPool資源 break; }
代碼非常簡單,另外如果你點(diǎn)擊了最后一個按鈕的話,SoundPool就會被釋放,然后再其他按鈕 就不會Duang了哦~
4.OnLoadCompleteListener監(jiān)聽聲音文件是否加載完畢
嗯,這個是臨時想起的,寫完在寫另一篇的時候突然想起,用法也很簡單,我們可以 往上面的代碼中添加OnLoadCompleteListener這個東東,然后重寫onLoadComplete()方法 ,最后為SoundPool對象設(shè)置這個東東即可!
mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { Toast.makeText(MainActivity.this,"加特技準(zhǔn)備完畢~",Toast.LENGTH_SHORT).show(); } });
關(guān)于怎么在android中利用SoundPool播放音頻問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
當(dāng)前名稱:怎么在android中利用SoundPool播放音頻
文章位置:http://aaarwkj.com/article30/ijheso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站制作、面包屑導(dǎo)航、動態(tài)網(wǎng)站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)