0

我创建了一个节拍器类型的应用程序,在钟摆上指定的摆动间隔为 750 毫秒,并以最大摆动弧度播放单个音频文件……重复摆动钟摆并无限期地播放声音。但是,我发现代码执行的实际时间因设备而异,甚至在单个设备上执行时也存在差异。我的意图是以每分钟 80 次的速度摆动钟摆,并用每个“节拍”播放音频文件。我调整了 750 毫秒设置以适应播放音频文件所需的时间。这将毫秒设置从 750 略微降低到大约 680。

我正在使用 Android SoundPool 访问 .wav 文件来播放声音。

我发现了很多关于 Soundpool 计时问题和顾虑的参考资料,但还没有找到一个可行且可靠的解决方案来为这样的应用程序提供一致的计时。

根据指定的延迟,钟摆的摆动似乎非常一致,所以我相信这种变化是由于在执行播放音频的 SoundPool 代码期间的可变时序造成的。是否有可靠的方法来执行代码以在 Android 上以一致且“准确”的时间间隔播放声音?

4

1 回答 1

1

一种方法是使用处理程序。这使您可以在完全相同的时间开始播放音频剪辑,而不管剪辑实际播放需要多长时间。您不需要 SoundPool,只需 SoundPlayer。

处理程序允许您安排在未来某个时间将消息传递到您的代码。由于使用 SoundPlayer 播放声音是异步的,因此您可以使用这种简单的机制定期播放声音。

这里有一些代码来展示它是如何工作的。

    handler = new Handler() {

        /* (non-Javadoc)
         * @see android.os.Handler#handleMessage(android.os.Message)
         */
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == NEXT_SOUND_MSG) {
                playNextSound()
            }
        }
    };

    // Set up media player for sounds
    player = new SoundPlayer(context);
    player.start();

    private void playNextSound() {
            if (mRunning) {

                // Play the sound
                int iSoundResId = item.getSoundResId();
                if (iSoundResId != -1) {
                        playSound(iSoundResId);
                }

                // schedule a message to advance to next item after duration
                Message msg = handler.obtainMessage(NEXT_SOUND_MSG);
                handler.sendMessageDelayed(msg, interval); 
            }
   }
于 2013-10-17T15:45:34.037 回答