Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 使用SoundPool播放音效,androidsoundpool

Android 使用SoundPool播放音效,androidsoundpool

編輯:關於android開發

Android 使用SoundPool播放音效,androidsoundpool


在Android開發中我們經常使用MediaPlayer來播放音頻文件,但是MediaPlayer存在一些不足,例如:資源占用量較高、延遲時間較長、不支持多個音頻同時播放等。這些缺點決定了MediaPlayer在某些場合的使用情況不會很理想,例如在對時間精准度要求相對較高的游戲開發中。

本文地址:http://www.cnblogs.com/wuyudong/p/5679191.html,轉載請注明源地址。

在游戲開發中我們經常需要播放一些游戲音效(比如:子彈爆炸,物體撞擊等),這些音效的共同特點是短促、密集、延遲程度小。在這樣的場景下,我們可以使用SoundPool代替MediaPlayer來播放這些音效。

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

就現在已知的資料來說,SoundPool有一些設計上的BUG,從固件版本1.0開始有些還沒有修復,我們在使用中應該小心再小心。相信將來Google會修復這些問題,但我們最好還是列出來:
  1. SoundPool最大只能申請1M的內存空間,這就意味著我們只能用一些很短的聲音片段,而不是用它來播放歌曲或者做游戲背景音樂。

  2. SoundPool提供了pause和stop方法,但這些方法建議最好不要輕易使用,因為有些時候它們可能會使你的程序莫名其妙的終止。建議使用這兩個方法的時候盡可能多做測試工作,還有些朋友反映它們不會立即中止播放聲音,而是把緩沖區裡的數據播放完才會停下來,也許會多播放一秒鐘。

  3. SoundPool的效率問題。其實SoundPool的效率在這些播放類中算是很好的了,但是有的朋友在G1中測試它還是有100ms左右的延遲,這可能會影響用戶體驗。也許這不能管SoundPool本身,因為到了性能比較好的Droid中這個延遲就可以讓人接受了。

  在現階段SoundPool有這些缺陷,但也有著它不可替代的優點,基於這些我們建議大在如下情況中多使用SoundPool:1.應用程序中的聲效(按鍵提示音,消息等)2.游戲中密集而短暫的聲音(如多個飛船同時爆炸)


接下來實踐一下:

新建項目,設計布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:onClick="click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="急救" />

</RelativeLayout>

在res文件夾下新建raw文件夾,導入音頻文件

添加代碼:

package com.wuyudong.soundpool;

import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    private SoundPool soundPool;
    private int soundId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        // 加載聲音資源
        soundId = soundPool.load(this, R.raw.alert, 1);
    }

    public void click(View view) {
        /*
         * int android.media.SoundPool.play(int soundID, float leftVolume, float rightVolume, 
         *                                         int priority, int loop, float rate)
         * Parameters: soundID a soundID returned by the load()
         * function leftVolume left volume value (range = 0.0 to 1.0)
         * rightVolume right volume value (range = 0.0 to 1.0) priority stream
         * priority (0 = lowest priority) loop loop mode (0 = no loop, -1 = loop
         * forever) rate playback rate (1.0 = normal playback, range 0.5 to 2.0)
         * Returns: non-zero streamID if successful, zero if failed
         */
        soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1.0f);
    }
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved