加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 19:47:57 所属栏目:百科 来源:网络整理
导读:我有一些非常短的音频片段(不到一秒钟)可以在各种事件上播放(按钮悬停,点击等).然而,在动作和声音的实际播放之间通常存在显着的滞后.我已尝试将声音嵌入.swf中,并在开始时将其加载到外部,但两者都会产生相同的结果.同样,我尝试过压缩和未压缩的音频. 看起来
我有一些非常短的音频片段(不到一秒钟)可以在各种事件上播放(按钮悬停,点击等).然而,在动作和声音的实际播放之间通常存在显着的滞后.我已尝试将声音嵌入.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();
    }
}

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读