Android開發之SoundPool使用詳解

來源:互聯網
上載者:User

Android開發之SoundPool使用詳解

使用SoundPool播放音效


如果應用程式經常播放密集、急促而又短暫的音效(如遊戲音效)那麼使用MediaPlayer顯得有些不太適合了。因為MediaPlayer存在如下缺點:

1) 延時時間較長,且資源佔用率高。

2) 不支援多個音頻同時播放。

Android中除了MediaPlayer播放音頻之外還提供了SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效,例如它可以開始就載入20個音效,以後在程式中按音效的ID進行播放。

SoundPool主要用於播放一些較短的聲音片段,與MediaPlayer相比,SoundPool的優勢在於CPU資源佔用量低和反應延遲小。另外,SoundPool還支援自行設定聲音的品質、音量、播放比率等參數。

SoundPool提供了一個構造器,該構造器可以指定它總共支援多少個聲音(也就是池的大小)、聲音的品質等。構造器如下:

SoundPool(int maxStreams, int streamType, int srcQuality):第一個參數指定支援多少個聲音;第二個參數指定聲音類型:第三個參數指定聲音品質。

一旦得到了SoundPool對象之後,接下來就可調用SoundPool的多個重載的load方法來載入聲音了。

SoundPool提供了如下4個load方法:

int load(Context context, int resld, int priority):從 resld所對應的資源載入聲音。

int load(FileDescriptor fd, long offset, long length, int priority):載入 fd 所對應的檔案的offset開始、長度為length的聲音。

int load(AssetFileDescriptor afd, int priority):從afd所對應的檔案中載入聲音。

int load(String path, int priority):從path對應的檔案去載入聲音。

上面4個方法中都有一個priority參數,該參數目前還沒有任何作用,Android建議將該參數設為1,保持和未來的相容性。

上面4個方法載入聲音之後,都會返回該聲音的的ID,以後程式就可以通過該聲音的ID來播放指定聲音。

SoundPool提供的播放指定聲音的方法:

int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate):該方法的第一個參數指定播放哪個聲音;leftVolume、rightVolume指定左、右的音量:priority指定播放聲音的優先順序,數值越大,優先順序越高;loop指定是否迴圈,0為不迴圈,-1為迴圈;rate指定播放的比率,數值可從0.5到2, 1為正常比率。

為了更好地管理SoundPool所載入的每個聲音的1D,程式一般會使用一個HashMap對象來管理聲音。

歸納起來,使用SoundPool播放聲音的步驟如下:

1) 調用SoundPool的構造器建立SoundPool的對象。

2) 調用SoundPool對象的load()方法從指定資源、檔案中載入聲音。最好使用HashMap< Integer, Integer>來管理所載入的聲音。

3) 調用SoundPool的play方法播放聲音。

下面的程式示範了如何使用SoundPool來播放音效。

程式碼如下:

publicclass SoundPoolDemoextends Activity {

Button btn1,btn2,btn3;

//建立一個SoundPool對象

SoundPool soundPool;

//定義一個HashMap用於存放音頻流的ID

HashMapmusicId=new HashMap();

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.mian);

btn1=(Button)findViewById(R.id.btn1);

btn2=(Button)findViewById(R.id.btn2);

btn3=(Button)findViewById(R.id.btn3);

//初始化soundPool,設定可容納12個音頻流,音頻流的品質為5,

soundPool=new SoundPool(12, 0,5);

//通過load方法載入指定音頻流,並將返回的音頻ID放入musicId中

musicId.put(1,soundPool.load(this, R.raw.awooga, 1));

musicId.put(2,soundPool.load(this, R.raw.evillaugh, 1));

musicId.put(3,soundPool.load(this, R.raw.jackinthebox, 1));

OnClickListener listener=new OnClickListener() {

@Override

publicvoid onClick(View v) {

//TODO Auto-generated method stub

switch (v.getId()) {

case R.id.btn1:

//播放指定的音頻流

soundPool.play(musicId.get(1),1,1, 0, 0, 1);

break;

case R.id.btn2:

soundPool.play(musicId.get(2),1,1, 0, 0, 1);

break;

case R.id.btn3:

soundPool.play(musicId.get(3),1,1, 0, 0, 1);

break;

default:

break;

}

}

};

btn1.setOnClickListener(listener);

btn2.setOnClickListener(listener);

btn3.setOnClickListener(listener);

}

}

程式運行:


實際使用SoundPool播放聲音時需要注意如下幾點:

SoundPool雖然可以一次性載入多個聲音,但由於記憶體限制,因此應該避免使用SoundPool來播放歌曲或者做遊戲背景音樂,只有那些短促、密集的聲音才考慮使用SoundPool進行播放。

雖然SoundPool比MediaPlayer的效果好,但也不是絕對不存在延遲問題,尤其在那些效能不太好的手機中,SoundPool的延遲問題會更嚴重。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.