簡體   English   中英

如何正確使用線程/運行循環並使用SoundPool播放聲音?

[英]How to properly use a thread/run loop and play sounds with SoundPool?

我正在構建一個以選定速度(bpm)播放音樂序列的應用程序。 我目前正在使用一個線程在每個節拍上觸發一個函數,然后使用SoundPool播放聲音。 但是,一次播放的聲音越多,速度越慢!

這是因為將播放聲音所需的時間添加到了playingThread睡眠的時間上嗎?

soundPool.play應該在后台線程而不是UI線程中嗎?

我也遇到同步問題,它會隨機加速和放慢速度,並且如果同時播放兩個聲音,它們並不總是同時播放。 對於Android 2.3.4來說還不錯,但是由於某些原因,對於Android 4.2.2來說確實很糟糕。

實現一致的速度和同步的最佳方法是什么?

這是我的主題:

public void playingThread()
{
    //Time interval in ms for thread sleep
    final long intervalInMs = (long) ((1 / (float) theBpm) * 60 * 250);

    Thread thread = new Thread() {
        @Override
        public void run() {
            while(playing == true) {
                beat();
                try {
                    Thread.sleep((long)(intervalInMs));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    thread.start();
}

然后調用此函數,該函數具有許多其他邏輯來計算播放和停止播放的聲音等:

public void beat()
{
    currentBeat++;

    //Play click sound every four beats
    if(currentBeat % 4 == 0) {
        soundPool.play(clickSoundId, 0.5f, 0.5f, 1, 0, 1f);
    }

    //ADDITIONAL LOGIC TO DETERMINE WHICH SOUNDS TO PLAY...

    int streamId = soundPool.play(soundIds[i], 1f, 1f, 1, 0, 1f);
}

謝謝

不要使用線程,也不要休眠主應用程序線程。 使用處理程序。 處理程序使您可以安排將來發生的事情而無需休眠主線程。 在這里查看我的答案

音樂總是至關重要的。 SoundPool並非為音樂所要求的精確度而設計。 SoundPool被設計為對輸入具有反應性,當觸發發生時(有時在例如游戲中)會生成聲音。 生成音樂時,您通常會知道什么時候會發出聲音,以便更好地安排它們。

我建議使用AudioTrack並直接寫入音頻緩沖區。 這是完全控制何時播放聲音彼此相關的唯一方法。 在延遲方面,您仍然受制於Android OS 硬件實現,但至少每個節拍都是穩定的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM