onResume
这是我用来在我的程序中播放音频的代码。从Java分析中我可以看到,clip.open()调用平均需要不到1ms。但是,偶尔会在随机时间阻塞几秒钟导致延迟。
下面的屏幕截图显示了我的Java分析器。如您所见,完全相同的方法被称为316次,没有问题。但有一次它在Clip.open()
上挂了2.4秒注意Clip.open甚至不显示在底部,因为花费的时间少于0.1ms。
我正在播放的剪辑大小都在100KB左右,我不明白为什么它可以正常工作316次,但有一次它会挂起。
我也尝试不关闭剪辑但是将它们全部打开,即使这样,问题仍然存在。
答案 0 :(得分:1)
通常程序员.open()在他们想要播放它之前提前一个Clip。播放的时刻应该只涉及.play()命令而不是其他任何内容。如果你们两个都打开了#34;和"玩"在连续命令中的剪辑中,play()可能会大大延迟,因为在执行play()命令之前必须将文件完整地加载到内存中。出于这个原因,如果你不能为Clip提供内存,那么SourceDataLine将更快地执行,因为它只需要在play()执行之前将缓冲区的值加载到内存中。
也许您已经了解了剪辑的这一方面,但问题并非如此。 (你提到在没有关闭它们的情况下播放剪辑。)Java的另一个事实是没有实时保证。系统确实可以很好地保持文件或剪辑的播放,但控制确切的起点很难。这是因为有几个因素,其中一个因素是花费多个线程和进程的时间。例如,如果垃圾收集命令在声音调用之前立即调用,则声音将必须等到该段完成并且处理器为声音线程提供优先级。
还有影响实时性能的其他因素,这些因素在以下文章中有详细说明:Real Time Low Latency Processing in Java
根据您的目标,有一些方法可以利用声音线程来提高计时准确度,通过"计算声音帧数"当正在执行该处理的操作时,正在处理特定声音帧时运行事件。但总的来说,音频和其他线程之间的通信会受到一些抖动的影响。