如何使计时器准确?(Flash / ActionScript 3.0)

3
我正在使用以下方法以X次/分钟的频率(X通过NumericStepper对象中的bpm确定)分发声音。
var mainTimer:Timer = new Timer(60 / (bpm.value * 1000),0);
mainTimer.addEventListener(TimerEvent.TIMER, fl_TimerHandler,false, 0, true); 
mainTimer.start();

function fl_TimerHandler(event:TimerEvent):void
     {
        metroTransform.volume = vol;
        flash.media.SoundMixer.soundTransform = metroTransform;
        metroChannel = metro.play();
        mainTimer.delay = 60 / bpm.value * 1000;
      }

根据http://www.metronomeonline.com/,声音不太好。我应该怎么做才能解决这个问题?
我得到的输出文件路径为:http://conatur.net/metroBig.swf

你尝试禁用音量转换了吗?每次调用该函数时,您都在调用flash.media.SoundMixer,您应该像metroTransform一样在函数外创建对象并实例化它。这只是一个猜测,但如果您使用的帧速率非常低,可以尝试提高它。 - The_asMan
你在这里有很多问题。第一个和最致命的是Flash有无法治愈的声音延迟问题,因此即使您的代码完美无缺,仍无法确保声音完全准时播放。@Valkie解决了其中一半的问题,但另一半问题只是无法真正“治愈”延迟问题的症状。 - scriptocalypse
2个回答

3

http://cookbooks.adobe.com/post_Accurate_timer-17332.html 可能会对您有所帮助。

问题
计时器类中两个事件之间的延迟取决于许多因素(fps、内存、播放影片剪辑等),计时器类属性delay设置的超时仅是近似值,因此需要一种方法来增加计时器的准确性。

解决方案
我提出的解决方案是扩展计时器类并强制计时器根据自定义属性accurate进行更多循环。这样,计时器的两个事件之间的延迟将设置为delay - + accurate /2。因为事件的触发取决于许多因素,实际上两个事件之间的延迟范围是从:delay - accurate/2到flash player下一个触发的事件之间。


0

嗯,延迟值不应该是

60000 / bpm.value
// with BPM = 80 we have 60000/80 = 750

替代

60 / (bpm.value * 1000)
// with BPM = 80 we have 60/80000 = 0.00075

由于文档中已经描述了时间延迟值:

delay:Number — 定时器事件之间的延迟,以毫秒为单位。不建议使用低于20毫秒的延迟。定时器频率限制为每秒60帧,这意味着低于16.6毫秒的延迟会导致运行时问题。

我想750毫秒比0.00075毫秒更合适。

然而,当我测试您的SWF并将BPM设置为60时,它每秒都能正常播放,所以我猜bpm.value不是看起来那样


无论如何,当我在两个标签页(或窗口)上打开您的swf和“metronomeonline”网站,并将它们设置为相同的BPM时,它们听起来是同步的。


你听了一段时间了吗?此外,当bpm高于130时,问题会变得更加严重。 - Lucas
130 BTM大约为460毫秒,因此它远远超出了20毫秒的限制,应该不会有问题。然而,AS3中的计时器与几乎所有语言一样都是基于主循环的,有时循环需要比其他循环花费更长的时间(由于技术原因)......这就是为什么很难拥有非常高精度的计时器,特别是在像AS3这样的语言中。我认为时间事件是可以的。 - Valkea
而验证计时器事件是否正常的最佳方法是不在5处重置显示计数器,然后为相对较长的时间(例如5分钟,因此可以使用手表进行计数)设置给定的BTM(例如180),最后将所得到的计数器值除以总时间(以分钟为单位)。因此,您将知道它是否被正确触发了(180 BPM的5分钟应该是900)。结果越接近预期结果,计时器事件就越精确...如果它足够精确,那么问题就是声音没有一直播放。 - Valkea
你每个tic播放的声音持续多长时间(以毫秒为单位)?也许当你调用下一个metro.play();时,你的声音还没有完成并重置(我不太记得AS3中声音是如何工作的,现在也没有任何测试的东西)。 - Valkea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接