gpt4 book ai didi

actionscript-3 - 声音播放延迟错误

转载 作者:行者123 更新时间:2023-12-04 06:49:52 24 4
gpt4 key购买 nike

我正在使用 Flex + AS3 编写简单的节拍器组件。例如,我希望它在每 500 毫秒和每 4 次播放另一个声音“tick2”之后播放“tick1”声音。但实际上声音之间的延迟并不相等 - 有时更小,有时更大一点。我在最新的 Chrome 上测试它。

这是我的代码:

//Somewhere here button bound to the 'toggle' function

import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.media.SoundTransform;
import flash.media.SoundChannel;

private var bpm:Number = 120; //2 bit per second, delay=500ms
private var period:Number = 4;
private var timer:Timer = new Timer(bpm, period);

[Embed(source='sounds/1.mp3')]
private var tickSound1Class:Class;
private var tickSound1:Sound;

[Embed(source='sounds/2.mp3')]
private var tickSound2Class:Class;
private var tickSound2:Sound;

private var trans:SoundTransform = new SoundTransform(1);

private function init():void {
....

tickSound1 = new tickSound1Class() as Sound;
tickSound2 = new tickSound2Class() as Sound;

update();


timer.addEventListener(TimerEvent.TIMER, onTimerEvent);

....
}

private function update():void {
timer.delay = 1000 * 60/bpm;
timer.repeatCount = 0;
}

private function toggle():void {
if (timer.running) {
timer.reset();
startStopButton.label = "Start";
} else {
update();
timer.start();
startStopButton.label = "Stop";
}
}

private function onTimerEvent(event:TimerEvent):void {
var t:Timer = event.currentTarget as Timer;

if (t.currentCount % period == 0)
tickSound1.play(0, 0, trans);
else
tickSound2.play(0, 0, trans);
}

最佳答案

我认为主要有两个原因:

  1. 已知Timer Flash Player 中的对象不准确,触发之间的延迟波动。
  2. Sound.play()方法还在声音真正开始播放之前引入了一些延迟,理论上这个延迟可以波动。在 Chrome 中使用的 PPAPI 版本的 Flash Player 中,延迟尤为明显。

有几种解决方案。我会建议其中之一:

  1. 使用整个节拍器循环的预制声音 (tick1-pause1-tick2-pause2) 并使用 Sound.play() 的第二个参数循环它方法;
  2. 使用动态声音生成。

第二种选择更灵活,但更难实现。基本上,您需要创建 Sound 的新实例对象,订阅它的 SAMPLE_DATA事件并将其称为 play()方法。在处理程序中,您将检查 event.position / 44.1 , 这将为您提供以毫秒为单位的当前声音生成位置。然后,如果您决定是时候播放 tick1 或 tick2 声音了,您将调用 tickN.extract(event.data, ...) , 其中tickN是 tick1 还是 tick2 Sound对象,否则写沉默。

您可以阅读有关动态声音生成的更多信息 here .

另外,请注意,当您调用 Sound.play() 时它返回 SoundChannel对象,它有 position属性(property)。它是否是当前正在播放的声音(未生成)的以毫秒为单位的位置,并且它是准确的。因此,使用此属性,您可以想出第三种方法:创建一个 Sound对象并设置一个 SAMPLE_DATA处理程序类似于动态声音生成解决方案,但将静音(零)写入 event.data对象一直在处理程序中。这是在不实际播放声音的情况下获得声音 channel 所必需的。然后,使用高帧率(60 FPS)和 Timer以尽可能小的延迟(1 毫秒)。每次Timer火灾,检查 soundChannel.position确定是否是播放滴答声的时候了,如果是这样,就像你在你的例子中所做的那样播放它。这种方法很可能解决 Timer 的问题不准确,但无法处理tickSound.play()引起的延迟方法。

关于actionscript-3 - 声音播放延迟错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14791668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com