Ste*_*nov 4 javascript audio latency soundmanager2
我定期播放一些音符.每一个都会延迟一个随机的毫秒数,从而产生刺耳的不规则效果.我如何解决它?
注意:只要它一致,我就会有一些延迟.
"实现你自己的小型SoundManager2替换,为时间敏感的播放进行了优化"的答案是可以的,如果你知道如何做到这一点:)但我试图避免在Flash中重写我的整个应用程序.
有关可听延迟为零的应用程序示例,请参阅基于闪存的ToneMatrix.
<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>
Run Code Online (Sandbox Code Playgroud)
Rog*_*ger 10
我知道这不是你想听到的答案,但无论你是否编写自己的flash库来播放声音,都无法阻止它.
对于每个说"它对我来说都很好!"的人 在海报演示中播放时,尝试调整大小或移动浏览器窗口.你会听到的不只是微妙的延迟.这在Firefox和IE中最为明显,但即便是Chrome也会体验到它.
更糟糕的是,如果您在浏览器窗口的关闭框中单击并按住鼠标,声音将完全停止,直到您释放鼠标(您可以将其释放到关闭框之外而不是实际关闭窗口,FYI).
这里发生了什么?
事实证明,当您开始调整大小或在浏览器窗口中移动时,浏览器会尝试多任务更改窗口属性的行为,以跟上窗口中的javascript.它会在需要时对窗口进行短暂更改.
当您在浏览器窗口中的关闭框上按住鼠标时,时间将完全停止.当你重新调整大小或移动窗口时,这就是以较小的增量发生的事情:时间在小的,零星的块(或大块,取决于你的机器有多慢)的javascript世界中静止不动.
现在,您可能会说"确定,调整浏览器大小或按住关闭按钮会使浏览器暂停,但通常情况下这不会发生".不幸的是你会错的.
它实际上一直在发生.我已经进行了测试,事实证明,即使完全静止浏览器窗口,不触摸鼠标,也不触摸键盘,计算机上的背景进程仍然会导致"打嗝",这意味着短暂的时间(也许只需几毫秒)时间在浏览器中"静止",完全随机的时间间隔在您的控制之外.
"静止不动"是什么意思?假设你有一个setInterval()调用(这也适用于setTimeout)每33毫秒运行一次(大约每秒30帧).现在,您可以期望在每33个"真实世界"毫秒后,您的函数将被调用.大多数时候,这都是事实.
但是当"打嗝"开始发生时,你的setInterval调用可能会在43毫秒内发生.在10毫秒期间发生了什么?没有.时间暂停.浏览器上没有任何内容正在更新.如果你有声音播放,它将继续播放,但没有新的声音调用将开始播放,因为根本没有执行javascript.如果你有5个setInterval()函数在运行,它们会在某个时刻暂停10ms.
告诉"时间停滞不前"的唯一方法是在setInterval函数回调中轮询实际时间.您将能够看到浏览器尝试在大多数情况下保持最新状态,但是当您开始调整窗口大小或执行紧张操作时,间隔将比平时更长,但所有代码都将保持同步(我正在使用这种技术制作游戏,所以你会看到你所有的游戏更新同步发生,但只是稍微结巴了).
通常,我应该指出,这些口吃是完全不明显的,除非你在setInterval时间内编写一个记录实际时间的函数(正如我在自己的测试中所做的那样),你甚至都不知道它.但是如果你尝试使用重复的play()调用来创建某种类型的重复声音(比如Asteriods背景中的嘟嘟声),那就成了一个问题.
我的建议?如果你有一个你知道的声音会循环,给它一个很长的持续时间,可能是10秒,你就不太可能注意到打嗝(现在,屏幕上的图形仍然可能打嗝,但是你被搞砸了).
如果你正在编写一个游戏并让主角从机关枪开火,不要对playSound('singleShot')进行10次快速连续调用,对playSound('machineGunFire10Rounds')进行一次调用,或者沿着那些行进行调用.
你必须做一些诡计来解决它,但在大多数情况下你会没事的.
似乎Flash applet运行的过程在某种程度上影响了常规浏览器/ javascript环境中发生的整个"时间冻结"的事情,但我仍然可以实现它,即使在你的ToneMatrix示例的链接上,调整大小或移动浏览器窗口.
但Flash似乎仍然比javascript好多了.当我单独离开浏览器时,我愿意打赌Flash不会在任何时间内冻结,并且间隔始终按时运行.
TL;博士:
归档时间: |
|
查看次数: |
2548 次 |
最近记录: |