如何在各种Android设备和操作系统版本之间提供一致的音频排序时序?

时间:2013-07-31 07:39:28

标签: android audio timing soundpool

我创造了一个节拍器类型的应用程序,摆锤上指定的摆动间隔为750毫秒,并在最大摆动弧上播放单个音频文件......重复摆动摆动和无限播放声音。但是,我发现代码执行的实际时间因设备而异,甚至在单个设备上执行差异。我的目的是以每分钟80次的速度摆动钟摆,并以每次“节拍”播放音频文件。我调整了750毫秒的设置以适应播放音频文件所需的时间。这将毫秒设置从750降低到大约680.我使用各种设备进行了测试,发现节拍器一分钟运行的结果与我使用各种Android设备进行测试时的时序差别很大,即使我正在定义我的时间基于毫秒的元素。

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

我发现了很多关于Soundpool时序问题和关注点的内容,但还没有找到一个可行且可靠的解决方案来为这样的应用程序提供一致的时序。

似乎摆锤的摆动基于指定的延迟是非常一致的,所以我认为变化是由于在播放音频的SoundPool代码执行期间的可变定时。是否有一种可靠的方法来执行代码,以便在Android的一致和“精确”时间间隔内播放声音?

1 个答案:

答案 0 :(得分: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); 
            }
   }