SoundPool聲音管理

SoundPool(android.media.SoundPool),顧名思義是聲音池的意思,主要用於播放一些較短的聲音片斷,支持從程序的資源或文件系統加載。與MediaPlayer相比,SoundPool的優點在於CPU資源佔用量低和反應延遲小。另外,SoundPool還支持自行設置聲音的品質、音量、播放比率等參數,支持經過ID對多個音頻流進行管理。 android

SoundPool存在的缺陷
    1.SoundPool最大隻能申請1M的內存空間,這就意味着咱們只能用一些很短的聲音片斷,而不是用它來播放歌曲或者作遊戲背景音樂。
  2.SoundPool提供了pause和stop方法,但這些方法建議最好不要輕易使用,由於有些時候它們可能會使你的程序莫名其妙的終止。建議使用這兩個方法的時候儘量多作測試工做,還有些朋友反映它們不會當即停止播放聲音,而是把緩衝區裏的數據播放完纔會停下來,也許會多播放一秒鐘。
  3.SoundPool的效率問題。其實SoundPool的效率在這些播放類中算是很好的了,可是有的朋友在G1中測試它仍是有100ms左右的延遲,這可能會影響用戶體驗。也許這不能管SoundPool自己,由於到了性能比較好的Droid中這個延遲就可讓人接受了。
  在現階段SoundPool有這些缺陷,但也有着它不可替代的優勢,基於這些咱們建議大在以下狀況中多使用SoundPool:1.應用程序中的聲效(按鍵提示音,消息等)2.遊戲中密集而短暫的聲音(如多個飛船同時爆炸) ide

import android.media.AudioManager;
import android.media.SoundPool; 函數

 

SoundPool soundPool;//聲明SoundPool對象 性能


//soundPool實例化,第一個參數爲soundPool能夠支持的聲音數量,這決定了Android爲其開設多大的緩衝區,第二個參數爲聲音類型,在這裏標識爲系統聲音,除此以外還有AudioManager.STREAM_RING以及AudioManager.STREAM_MUSIC等,系統會根據不一樣的聲音爲其標誌不一樣的優先級和緩衝區,最後參數爲聲音品質,品質越高,聲音效果越好,但耗費更多的系統資源。 測試

soundPool= new SoundPool(10,AudioManager.STREAM_SYSTEM,5); this

//系統爲soundPool加載聲音 第一個參數爲上下文參數,第二個參數爲聲音的id,第三個參數爲聲音的優先級,當多個聲音衝突而沒法同時播放時,系統會優先播放優先級高的。通常咱們將聲音信息保存在res的raw文件夾下
//載入音頻流,返回在池中的id
int sourceid = soundPool.load(this,R.raw.collide,1); 對象

//播放,第一個參數爲id,id即爲放入到soundPool中的順序,好比如今collide.wav是第一個,所以它的id就是1。第二個和第三個參數爲左右聲道的音量控制。第四個參數爲優先級,因爲只有這一個聲音,所以優先級在這裏並不重要。第五個參數爲是否循環播放,0爲不循環,-1爲循環。最後一個參數爲播放比率,從0.5到2,通常爲1,表示正常播放。
soundPool.play(1,1, 1, 0, 0, 1); 遊戲


注意:
若是SoundPool剛調完加載load函數以後,直接調用SoundPool的play函數可能出現
error "sample 1 not READY"
因此建議,調用加載資源函數load以後,實現資源加載結束的監聽函數,在這個監聽到資源加載結束以後,播放音頻文件。
如:
     SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 5);
      //載入音頻流,返回在池中的id 
      final int sourceid = soundPool.load(mContext, R.raw.move_sound, 0);
      //播放音頻,第二個參數爲左聲道音量;第三個參數爲右聲道音量;第四個參數爲優先級;第五個參數爲循環次數,0不循環,-1循環;第六個參數爲速率,速率最低0.5最高爲2,1表明正常速度 
     soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
              
           public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    // TODO Auto-generated method stub
                    soundPool.play(sourceid, 2, 2, 0, 0, 1);
                   }
     }); 內存

相關文章
相關標籤/搜索