如何使用SoundPool同步声音

问题描述 投票:7回答:2

我一直在尝试同时播放一些声音;目前,我正在使用SoundPool的共享实例。我希望在完全相同的时间播放1、2或3个声音,而不会出现延迟。

[当连续调用SoundPool.play(...)X次时,声音会按照您认为的顺序播放。在实现我可以准备同时播放的所有声音然后将其作为一个声音播放的情况下,要实现这一目标的合适方法是什么?

Sudo代码:

SoundPool _soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);

_soundPool.load(_context, soundId1, 1);
_soundPool.load(_context, soundId2, 1);
_soundPool.load(_context, soundId3, 1);

_soundPool.play(soundId1, vol, vol, 1, 0, 1f);
_soundPool.play(soundId2, vol, vol, 1, 0, 1f);
_soundPool.play(soundId3, vol, vol, 1, 0, 1f);
android audio soundpool android-audiomanager
2个回答
0
投票

我有时会在一个声音池中完成一个声音,这可能会对您有所帮助。Android:sound pool and service

谢谢


0
投票

[您需要了解SoundPool.load方法是异步的,因此,当您连续调用3次然后调用play时,实际上不会加载任何保证。因此,您需要等待所有声音加载完毕。为此,请使用OnLoadCompleteListener

fun loadAndPlay(soundPool: SoundPool, context: Context, resIds: IntArray) {
    val soundIds = IntArray(resIds.size) {
        soundPool.load(context, resIds[it], 1)
    }

    var numLoaded: Int = 0

    soundPool.setOnLoadCompleteListener { sPool, sampleId, status ->
        numLoaded++

        if (numLoaded == resIds.size) {
            soundPool.setOnLoadCompleteListener(null)

            for (id in soundIds) {
                soundPool.play(id, 1f, 1f, 1, 0, 1f)
            }
        }
    }
}

要使用:

loadAndPlay(soundPool, context, intArrayOf(R.raw.sound_1, R.raw.sound_2, R.raw.sound_3))
© www.soinside.com 2019 - 2024. All rights reserved.