当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Flash9,Actionscript3中播放短音的延迟》经验,为你挑选了1个好方法。

我有几个非常短的音频片段(不到一秒钟)可以在各种事件上播放(按钮悬停,点击等).然而,在动作和声音的实际播放之间通常存在显着的滞后.我已经尝试将声音嵌入到.swf中,并在开始时将其加载到外部,但两者都会导致相同的结果.同样,我尝试过使用压缩和未压缩的音频.

看起来就像是音频缓冲区只是很多的时间比我需要他们,像或许闪光灯更倾向于在开始的声音多了几分延迟为代价玩更长的声音,没有任何口吃优化.这可能吗?有没有办法改变它们?因为我正在做的事情永远不需要播放超过一秒钟左右的声音并且总是在开始时完全加载,所以真的很短的缓冲区也不会有害.

另一个可能的原因可能是:如果我在使用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.滞后显而易见,有人在看到它时的第一个抱怨是按钮徘徊的声音效果似乎延迟了,所以这不仅仅是我挑剔.我觉得我必须做错事; 有太多闪光灯的东西都有快速的声音效果,没有任何接近这种延迟.

编辑:响应关于声音文件本身的第一个响应,我已经检查过,声音在文件开头立即开始(甚至剪掉除了第一毫秒声音之外的所有声音,我仍然可以听到声音的开始它产生的"滴答声"噪音.



1> James Fasset..:

这是一件小事但是:

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是一个使用整数索引的有序集.在这种情况下,您希望使用对象(或字典)并将其命名为soundMap(因为它将声音名称映射到声音对象).

至于声音延迟 - 应该没有.我在Flash中做了很多声音(包括大量的翻转和翻转声音),这从来就不是问题.但是,Flash Player 10有一个新的低级声音API,由该文章中的Adobe工程师之一描述.一个涉及到它的解决方案是一个大锤,但也许你正在寻找毫秒精度.

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

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有