3

我正在为安卓制作节拍器。当它只是捕捉时间时,我能够以 1-5 毫秒的精度运行 play_tick() 函数,但是一旦我想另外播放声音,系统就会变得不准确(最差的十倍)。您对我如何改善这一点有任何线索吗?有时,系统也会完全随机跳过播放刻度。有什么办法可以提高任务的优先级,或者调度程序会优先考虑后台运行的android任务吗?我已经搜索了一段时间,但找不到任何线索。

所有帮助将不胜感激!

我已经稍微更新了代码:

public void soundMetronome(){
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.click);
    metronome = new TimerTask() {
            public void run() {
                    handler.post(new Runnable() {
                            public void run() {
                                if(counter<SAMPLE_LENGTH){
                                            store_time[counter] = System.currentTimeMillis();
                                    mp.start(); 
                                    counter++;
                                    Log.d("TIMER", "Timer set off");
                                }
                                else{
                                    stopScan();
                                                                        }
                            }
                   });
            }};


            t.scheduleAtFixedRate(metronome, 0, SAMPLE_INTERVAL_MS); 

        }

但是,对于 500 毫秒左右的间隔,它仍然非常不准确。对于大约 1000 毫秒的间隔,它非常稳定。问题不在于计时器任务本身,而是在我读取 currentTimeMillis() 和来自 MediaPlayer 的 PLAYBACK_COMPLETE 消息的时间之间,一些原生 android 进程似乎中断了。

有没有办法可以在 mp.start() 之后调用 mp.prepare() 以便媒体播放器准备好在调用计时器函数时立即运行?

我正在使用 Galaxy S3 和 Android 4.1

谢谢

4

1 回答 1

1

缺乏精度是由垃圾收集引起的。尝试摆脱在每个刻度上创建新对象。在您的代码MediaPlayer中,每次都创建新的 on play_tick,它应该只被初始化一次(顺便说一句,您缺少MediaPlayer.release调用)。

您也可以只使用Handler.postDelayed而不是TimerTaskand Handler.post

于 2012-10-12T15:37:13.353 回答