我有几个非常短的音频片段(不到一秒钟)可以在各种事件上播放(按钮悬停,点击等)。然而,在动作和声音的实际播放之间通常存在显着的滞后。我已经尝试将声音嵌入到.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。滞后显而易见,有人在看到它时的第一个抱怨是按钮徘徊的声音效果似乎延迟了,所以这不仅仅是我挑剔。我觉得我必须做错事;那里有太多的闪光灯,没有任何接近这种滞后的声音效果。
编辑:为了回应关于声音文件本身的第一个响应,我已经检查了,声音在文件开头立即开始(甚至剪掉了除了第一毫秒声音之外的所有声音,我仍然可以听到它产生的'滴答'噪音的开始。)
答案 0 :(得分: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是一个使用整数索引的有序集。在这种情况下,您想使用对象(或字典)并将其命名为soundMap(因为它将声音名称映射到声音对象)。
至于声音延迟 - 应该没有。我在Flash中做了很多声音(包括大量的翻转和翻转声音),这从来就不是问题。但是,Flash Player 10有一个新的low-level sound API,由该文章中的Adobe工程师之一描述。一个涉及到它的解决方案是一个大锤,但也许你正在寻找毫秒精度。
fenomas给出的建议是明智的:在开始和结束时检查mp3文件是否有死区,并尽可能地将其修剪。另外 - 从事件处理程序到播放语句的路径是什么?那里有可能的街区吗? mp3的格式是什么?闪存最适合特定编码(我认为44.1 hHz和128位)。
答案 1 :(得分:4)
嗯,我的第一个腮红的答案是,当我做了这样的事情时,通常我发现声音文件内置了一定的提前期。你可以查看声音编辑器,但是我做了什么过去完成的是将声音导入Flash IDE,制作一个空的影片剪辑,并将声音放在剪辑的第1帧上。然后,但编辑帧声音你会得到一个漂亮的小界面来拖动声音播放的开始/结束点。然后我习惯于附加/删除剪辑来播放声音,或者将其留在某处并使用帧命令。
如果您已经确定提前时间是闪存而不是音频,那么我没有任何提示或技巧,除了合理显而易见的事情,比如在按键上播放点击声而不是向上...
答案 2 :(得分:4)
我有完全相同的问题......直到我发现问题只发生在Flash中预览时才发生。尝试运行编译的swf(它对我有用)。
答案 3 :(得分:3)
我遇到了同样的问题。碰到了这个。 显然,如果你让声音播放器在后台静静地“走”,它就不需要“重启”小声音。尚未尝试过......
答案 4 :(得分:2)
一种解决方案可能是使用将声音文件作为二进制数据读取的ActionScript库。
StandingWave
https://github.com/maxl0rd/standingwave3
http://maxl0rd.github.com/standingwave3/
此外,请务必检查SWF周围环境的音频设置。我正在调试我的应用程序几个小时,直到我意识到延迟来自我的蓝牙耳机连接。
答案 5 :(得分:1)
我使用Flash Player 10.0.2.x时声音严重不足(约1整秒)。停止声道时的响度是相同的。
我刚刚升级到10.0.22.x,问题就消失了。