在Flash 9,Actionscript 3中播放短音时的延迟

我有几个非常短的音频剪辑(不到一秒钟)可用于各种事件(按钮悬停,点击等)。 然而,声音的动作和实际播放之间通常存在显着的滞后。 我试过在.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。 这种滞后很明显,有人看到的第一个抱怨之一是,按钮盘旋的声音效果似乎被延迟了,所以它不仅仅是我挑剔。 我觉得我必须做错事; 那里有太多闪光的东西,没有任何接近这种滞后的声音效果。

编辑:为了响应关于声音文件本身的第一个响应,我已经检查过,并且声音在文件开始时立即开始(甚至截取除了第一毫秒的声音之外的所有内容,我仍然可以听到开始它产生的“嘀嗒”噪音)。


这是一件小事,但是:

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,由该文章中的Adobe工程师之一描述。 涉及到的解决方案有点像大锤,但也许你正在寻找毫秒精度。

fenomas给出的建议是明智的:在开始和结束时检查mp3文件中的死区,并尽可能将其修剪。 另外 - 从事件处理程序到播放声明的路径是什么? 那里有没有可能的街区? mp3的格式是什么? 闪存最适合特定的编码(我相信44.1赫兹和128位)。


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

如果你已经确定提前期是闪光灯而不是音频,那么我就没有任何提示或技巧,除了在按键上播放单击声音而不是提高声音之类的合理显而易见的事情之外......


我有完全相同的问题......直到我注意到问题只发生在Flash中预览时。 尝试运行编译的SWF(它对我有用)。

链接地址: http://www.djcxy.com/p/67927.html

上一篇: Latency in playing short sounds in Flash 9, Actionscript 3

下一篇: SCons fails to find generated file