6

我有一些非常短的音频剪辑(不到一秒长)要在各种事件(按钮悬停、单击等)上播放。但是,动作和声音的实际播放之间通常存在明显的滞后。我尝试将声音嵌入到 .swf 中,并在开始时将其从外部加载,但都导致相同的结果。同样,我尝试过压缩和未压缩的音频。

看起来音频缓冲区比我需要的要长得多,就像 Flash 可能更优化以播放更长的声音而不会出现任何口吃,但代价是开始声音的延迟时间更长。会是这样吗?有什么办法可以改变它们吗?由于我正在做的工作永远不需要播放声音超过一秒左右,并且总是会在开始时完全加载,因此拥有非常短的缓冲区根本不会造成伤害。

另一个可能的原因是:如果我在使用 loadSound() 时使用 .wav 文件...我无法让它真正播放声音。没有错误,一切都按原样返回,但没有播放实际的声音,这就是我目前将它们作为 .mp3 的原因。也许在使用 .mp3 音频(或任何压缩音频)时,解码时会有延迟?不过,我对此仍有疑问的原因是,当将它们作为 .wav 文件嵌入到 .swf 中时(通过将它们导入库中),它们在播放时仍然具有相同的延迟。

只是为了进行完整性检查,我将包含我拥有的代码,减去不相关的部分和错误检查。首先,在运行时加载它们:

var soundArray:Array = new Array();
loadSound( "click", "sounds/buttondroop4.mp3" );
loadSound( "hover", "sounds/Dink-Public_D-146.mp3" );

function loadSound( name:String, url:String ):void
{
   var req:URLRequest = new URLRequest( url );
   soundArray[ name ] = new Sound( req );
   soundArray[ name ].addEventListener( Event.COMPLETE, soundLoaded );
}
function soundLoaded( event:Event ):void
{
   for( var name:String in soundArray )
   {
      if( event.target == soundArray[name] )
      {
         trace( "Loaded sound [" + name + "]" );
         return;
      }
   }
}
function playSound( name:String ):void
{
   for( var nameSrc:String in soundArray )
   {
      if( name == nameSrc )
      {
         var channel:SoundChannel = soundArray[ name ].play();
         return;
      }
   }
}

// Sometime later, well after soundLoaded() callback is triggered...
playSound( "click" );
playSound( "hover" );

还有一种替代方法,将它们作为类嵌入到库中并从那里开始:

var sClick:soundClick = new soundClick();
var sHover:soundHover = new soundHover();
sClick.play();
sHover.play();

声音文件很小,一般小于 10kb。滞后很明显,以至于有人在看到它时首先抱怨的一个是按钮悬停时的声音效果似乎延迟了,所以不仅仅是我很挑剔。我觉得我一定是做错了什么;那里有太多闪光的东西,它们具有快速的声音效果,而没有任何接近这种滞后的地方。

编辑:为了响应关于声音文件本身的第一个响应,我已经检查过了,声音在文件的开头立即开始(即使剪掉除了声音的第一毫秒之外的所有内容,我仍然可以听到开始它发出的“滴答”声)。

4

6 回答 6

6

这是一件小事,但是:

function playSound( name:String ):void
{
   for( var nameSrc:String in soundArray )
   {
      if( name == nameSrc )
      {
         var channel:SoundChannel = soundArray[ name ].play();
         return;
      }
   }
}

应该:

function playSound(name:String):void
{
    if(soundArray[name])
    {
        soundArray[name].play();
    }
}

不需要循环查找,因为这就是哈希表的用途。此外,您根本不应该使用 Array ,因为 Array 是使用整数索引的有序集。在这种情况下,您想使用一个对象(或字典)并将其命名为 soundMap(因为它将声音名称映射到声音对象)。

至于声音延迟——应该没有。我已经在 Flash 中制作了相当多的声音(包括大量的翻转和推出声音),这从来都不是问题。然而,Flash Player 10 有一个新的低级声音 API,该 API 的一位 Adob​​e 工程师在该文章中进行了描述。涉及到的解决方案有点像大锤,但也许您正在寻找毫秒精度。

fenomas 给出的建议是明智的:检查 mp3 文件的开头和结尾是否有死区,并尽可能将其修剪。另外 - 从事件处理程序到您的播放语句的路径是什么?那里有任何可能的障碍吗?mp3的格式是什么?Flash 最适合特定编码(我相信 44.1 hHz 和 128 位)。

于 2008-10-26T16:10:18.167 回答
4

嗯,我第一个脸红的回答是,当我完成这样的事情时,通常我会发现声音文件有一定的前置时间。你可以检查声音编辑器,但我在过去是将声音导入Flash IDE,制作一个空的影片剪辑,将声音放在剪辑的第1帧。然后,但编辑帧声音,你会得到一个漂亮的小界面来拖动声音播放的开始/结束点。然后我过去常常附加/删除剪辑以播放声音,或者将其留在某处并使用帧命令。

如果您已经确定前置时间是 Flash 而不是音频,那么我没有任何提示或技巧,除了相当明显的事情,例如在按键按下而不是向上播放点击声音......

于 2008-10-23T02:55:27.513 回答
4

遇到了完全相同的问题...直到我注意到该问题仅在 Flash 中预览时才发生。尝试运行已编译的 swf(它对我有用)。

于 2008-12-15T17:24:16.430 回答
3

我有同样的问题。遇到了这个。显然,如果您让声音播放器在后台静默“运行”,则不需要为小声音“重新启动”。还没试过。。。

http://www.ghostwire.com/blog/archives/as3-fixing-the-lag-that-arises-when-playing-a-short-sound-effect/

于 2009-08-25T13:13:00.120 回答
2

一种解决方案可能是使用将声音文件作为二进制数据读取的 ActionScript 库。

常设
波 https://github.com/maxl0rd/standingwave3
http://maxl0rd.github.com/standingwave3/

此外,请务必检查 SWF 周围环境的音频设置。我调试了我的应用程序几个小时,直到意识到延迟来自我的蓝牙耳机连接。

于 2011-08-31T19:36:44.407 回答
1

我在使用 Flash Player 10.0.2.x 时声音延迟很差(大约 1 整秒)。停止声道时的潜伏期相同。

我刚刚升级到 10.0.22.x,问题就消失了。

于 2009-07-19T00:58:23.303 回答