我有一些非常短的音频剪辑(不到一秒长)要在各种事件(按钮悬停、单击等)上播放。但是,动作和声音的实际播放之间通常存在明显的滞后。我尝试将声音嵌入到 .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。滞后很明显,以至于有人在看到它时首先抱怨的一个是按钮悬停时的声音效果似乎延迟了,所以不仅仅是我很挑剔。我觉得我一定是做错了什么;那里有太多闪光的东西,它们具有快速的声音效果,而没有任何接近这种滞后的地方。
编辑:为了响应关于声音文件本身的第一个响应,我已经检查过了,声音在文件的开头立即开始(即使剪掉除了声音的第一毫秒之外的所有内容,我仍然可以听到开始它发出的“滴答”声)。