2012-04-14 108 views
3

我正在编写一个使用录制的样本播放音乐的Android应用程序(使用SoundPool)。我有一个播放器根据当前时间(realTimeElapsed)检查我必须播放哪些样本。玩家获得更新,我设置为1毫秒的计时器。大部分时间这个工作正常,但有时我有一些延迟约100毫秒。Android:精确播放音频的时机

我找不到增加定时器优先级的方法,是否有另一种方法来获得这些延迟?

我在同一时间使用openGL渲染场景,但是如果禁用所有绘图,我会得到相同的延迟。

感谢

编辑:

我TraceView分析它:音频线程(线程16)获取每毫秒执行。但在t = 2580时,有大约200毫秒的突破。线程在此期间未处于睡眠状态,但在方法SoundPool.play中并且被中断。每当我有这样的延迟,音频线程就会中断。没有办法阻止这些干扰吗?

我已经将GL线程(即中断音频线程)的优先级设置为THREAD_PRIORITY_LOWEST。 TraceView

右键点击图片并选择“显示图像”或附近的其他物业,可得到全分辨率的图像。

+0

200ms听起来很大。这可能是垃圾收集造成的吗?发生垃圾回收时会有一条消息被打印到logcat。只要确保它是来自您的流程的消息,而不是其他任何随机流程。 – JesusFreke 2012-04-15 03:51:13

+0

此时没有GC正在运行,您会在TraceView中看到GC。在这200ms期间,OpenGL线程一直在运行(请右键单击图像并选择“显示图像”或其附近的某个图像以全分辨率查看图像) – osiris81 2012-04-15 13:41:37

+0

如果我不想使用Soundpool,不会调用SoundPool的播放方法,我没有任何延迟。我将不得不为这个问题开一个新的线程 – osiris81 2012-04-15 21:27:22

回答

0

我会建议尝试Handler.postDelayed()而不是定时器,并看看你是否得到更好的结果。

如果没有,也许只是一个短的Thread.Sleep()System.nanoTime()检查?

+0

嗨,谢谢你的答案。我尝试了两种方法,但没有取得真正的成功:使用Handler.postDelayed与Timer相同;我目前正在使用自己的高优先级线程和睡眠一毫秒,但我仍然会延迟大约100毫秒... – osiris81 2012-04-15 01:45:08