我会定期播放一些音符。每一个都会延迟一个随机的毫秒数,从而产生刺耳的不规则效果。我该如何解决?
注意:只要它一致,我就会有一些延迟。
类型的答案“实现你自己的小型SoundManager2替换,针对时间敏感的播放进行了优化”是好的,如果你知道如何做到这一点:)但我现在试图避免在Flash中重写我的整个应用程序。
有关可听延迟为零的应用示例,请参阅基于闪存的ToneMatrix。
测试用例 (see it here live或get it in an zip):
<head>
<title></title>
<script type="text/javascript"
src="http://www.schillmania.com/projects/soundmanager2/script/soundmanager2.js">
</script>
<script type="text/javascript">
soundManager.url = '.'
soundManager.flashVersion = 9
soundManager.useHighPerformance = true
soundManager.useFastPolling = true
soundManager.autoLoad = true
function recur(func, delay) {
window.setTimeout(function() { recur(func, delay); func(); }, delay)
}
soundManager.onload = function() {
var sound = soundManager.createSound("test", "test.mp3")
recur(function() { sound.play() }, 300)
}
</script>
</head>
<body>
</body>
</html>
答案 0 :(得分:10)
答案 1 :(得分:1)
在我对你的问题的评论中,我提到我在播放你的样本时没有听到不正常的情况。这意味着我要么是“节奏聋”,要么你的设置中可能存在干扰良好实时性能的东西。您没有提及您的环境的任何细节,但是您的计算机上可能正在运行其他正在吸收CPU周期的进程,或者可能无法很好地处理声音延迟的旧版Flash。我自己使用的是Flash(10.something)的最新版本,而你的参数需要使用Flash 9.但也许我应该假设,如果你足够聪明,可以使用SoundManager2和StackOverflow来消除这些问题。 / p>
所以这里有一些故障排除的可能性和评论:
1)SoundManager网站有许多演示,包括JS-DOM "painting" + Sound, V2。您是否听到不正常的延迟和延误?如果没有,也许你可以比较他们在那里做的和你正在做的事情。如果是,那么可以查看您的机器环境。当我运行该演示时,它非常敏感。 (编辑:然而,仔细观察,你可以看一下笔画大小在笔画中的变化情况。因为它随着鼠标事件之间的时间间隔而变化(假设你保持不变)鼠标速度),您可以直观地看到鼠标事件模式中的任何不规则。我可以看到邮票大小的偶然变化,这表明鼠标事件不会定期进入。这将我们带到Javascript事件。)
2)Javascript setTimeout()
和setInterval()
在时间方面不是很可靠。大多数情况下,他们会回到你所要求的间隔期间的某个球场,但是可能存在大的变化,通常是延迟,这使得它们变得不可靠。我发现在Flash中使用ActionScript时也是如此。您可能希望打印出sound.play()调用的时间,以查看异常是否是由于setTimeout/setInterval()
中的不规则造成的。如果是这种情况,您可以尝试缩短间隔,然后轮询系统时间以更接近您想要的300毫秒间隔。您可以使用new Date().getTime()
轮询系统时间,这似乎具有ms准确性。轮询当然是一个可怕的黑客,当它们被用于其他东西时会吸收周期,我一般不推荐它,但你可以尝试看它是否有帮助。 编辑:这是a writeup by John Resig on the handling of input and timer events in js。
3)当flash播放声音时,通常会涉及延迟,这样玩家就可以“建立一个蒸汽头”并确保缓冲区中有足够的东西在下一个缓冲区请求被填充之前播放。这种延迟与不间断播放的可靠性之间存在折衷。这可能是你无法做任何事情的限制,除了“实现你自己的小型SoundManager2替换”,我知道你不想这样做。
希望这会有所帮助。我最近写了一个AS3声音实验,让我了解了一些基础知识,并将观察这个空间,看看人们提出了什么其他建议。
答案 2 :(得分:0)
您正在使用javascript间隔,无法保证在准确时间触发。我确信内部闪存时序更可靠。
但这可能会有所帮助,在您触发播放声音后会重复发射。
window.setTimeout(function() { func(); recur(func, delay); }, delay);
答案 3 :(得分:0)
正如另一个答案中所解释的那样,你无法避免这种情况。但...
我done some experiments来缓解这个问题,最后我使用了:
看一下演示的prototype上的来源,并且(如果可能的话)给lowLag一个镜头。它对我很有用。
祝你好运!