Android頻繁播放簡短音訊解決方案---SoundPool

CrackgmKey發表於2017-10-31

本人小菜,昨天接到這樣的一個需求,我們有一個智慧書櫃,使用者按密碼開鎖,開鎖的時候按數字幾就要播放數字幾的發音,我當時就想到了MediaPlayer可以搞,沒錯,是可以,但是用著用著就出來了一點小遐思,老闆肯定不同意啊,於是百度好久終於找到了一個據說已經廢棄的了SoundPool,簡單的瞭解了一下SoundPool,他和MediaPlayer來比 就好像一個是輕量級一個是重量級的東西,他沒有MediaPlayer播放的延遲,也沒有載入的等待,更沒有資源的過大,但是,之前我們也說了 他是屬於一個輕量級的東西,因為他只適合播放小音訊檔案,比如按鍵音效或者遊戲音效等等,另外SoundPool推舉的語音格式是OGG,但是對於MP3也支援,但是為了安全起見,我們還是用OGG吧,把資源放到res-raw目錄下


好了 廢話不多說 開擼

首先建立一個SoundPool物件

// SoundPool物件
public static SoundPool mSound = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
SoundPool有三個引數 分別代表

maxstreams 這個SoundPool物件的最大數量的同步流
streamtype 音訊流式在audiomanager為例介紹,遊戲應用中通常會使用STREAM_MUSIC
srcquality 取樣率轉換器的質量。目前有沒有影響。使用0的預設。
來自官方的翻譯:http://www.android-doc.com/reference/android/media/SoundPool.html


接下來寫新增音訊檔案的方法

/**
 * 初始化音訊檔案
 */
private void initMusic(){
    //分別加入到SoundPool中
    mSound.load(this, R.raw.b0, 1);// 1
    mSound.load(this, R.raw.b1, 1);// 2
    mSound.load(this, R.raw.b2, 1);// 3
    mSound.load(this, R.raw.b3, 1);// 4
    mSound.load(this, R.raw.b4, 1);// 5
    mSound.load(this, R.raw.b5, 1);// 6
    mSound.load(this, R.raw.b7, 1);// 8
    mSound.load(this, R.raw.b8, 1);// 9
    mSound.load(this, R.raw.b9, 1);// 10
}

在onCreate中初始化此方法

下面我們來寫播放音訊的方法

/**
 * 播放MP3資源
 * @param resId 資源ID
 */
private void StartMusic(int resId){
    /**
     * 第一個引數為播放音訊ID
     * 第二個 第三個為音量
     * 第四個為優先順序
     * 第五個為是否迴圈播放
     * 第六個設定播放速度
     * 返回值 不為0即代表成功
     */
    int type = mSound.play(resId, 15, 15, 0, 0, 1);
}


下面來貼一下整體程式碼

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    // SoundPool物件
    public static SoundPool mSound = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button_0).setOnClickListener(this);
        findViewById(R.id.button_1).setOnClickListener(this);
        findViewById(R.id.button_2).setOnClickListener(this);
        findViewById(R.id.button_3).setOnClickListener(this);
        findViewById(R.id.button_4).setOnClickListener(this);
        findViewById(R.id.button_5).setOnClickListener(this);
        findViewById(R.id.button_6).setOnClickListener(this);
        findViewById(R.id.button_7).setOnClickListener(this);
        findViewById(R.id.button_8).setOnClickListener(this);
        findViewById(R.id.button_9).setOnClickListener(this);
        initMusic();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button_0:
                StartMusic(1);
                break;
            case R.id.button_1:
                StartMusic(2);
                break;
            case R.id.button_2:
                StartMusic(3);
                break;
            case R.id.button_3:
                StartMusic(4);
                break;
            case R.id.button_4:
                StartMusic(5);
                break;
            case R.id.button_5:
                StartMusic(6);
                break;
            case R.id.button_6:
                StartMusic(7);
                break;
            case R.id.button_7:
                StartMusic(8);
                break;
            case R.id.button_8:
                StartMusic(9);
                break;
            case R.id.button_9:
                StartMusic(10);
                break;
        }
    }

    /**
     * 播放MP3資源
     * @param resId 資源ID
     */
    private void StartMusic(int resId){
        /**
         * 第一個引數為播放音訊ID
         * 第二個 第三個為音量
         * 第四個為優先順序
         * 第五個為是否迴圈播放
         * 第六個設定播放速度
         * 返回值 不為0即代表成功
         */
        int type = mSound.play(resId, 15, 15, 0, 0, 1);
    }

    /**
     * 初始化音訊檔案
     */
    private void initMusic(){
        //分別加入到SoundPool中
        mSound.load(this, R.raw.b0, 1);// 1
        mSound.load(this, R.raw.b1, 1);// 2
        mSound.load(this, R.raw.b2, 1);// 3
        mSound.load(this, R.raw.b3, 1);// 4
        mSound.load(this, R.raw.b4, 1);// 5
        mSound.load(this, R.raw.b5, 1);// 6
        mSound.load(this, R.raw.b7, 1);// 8
        mSound.load(this, R.raw.b8, 1);// 9
        mSound.load(this, R.raw.b9, 1);// 10
    }
}

到這裡一個簡單的小demo就完成了,大家根據自己的需要學習,另外語音合成軟體和OGG格式轉換軟體 我會打包給大家,一起進步

下載地址:http://download.csdn.net/download/crackgmkey/10046337

相關文章