gpt4 book ai didi

flash - 在 Flash 9、Actionscript 3 中播放短声音的延迟

转载 作者:行者123 更新时间:2023-12-04 13:10:30 25 4
gpt4 key购买 nike

我有一些非常短的音频剪辑(不到一秒长)可以在各种事件(按钮悬停、点击等)上播放。但是, Action 与实际播放声音之间通常存在明显的滞后。我已经尝试将声音嵌入到 .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 有一个新的 low-level sound API该文章中的一位 Adob​​e 工程师对此进行了描述。涉及到的解决方案有点像大锤,但也许您正在寻找毫秒精度。

fenomas 给出的建议是明智的:检查 mp3 文件的开头和结尾是否有死区,并尽可能地修剪它。另外 - 从事件处理程序到您的播放语句的路径是什么?那里有可能的块吗? mp3的格式是什么? Flash 最适合特定编码(我相信 44.1 hHz 和 128 位)。

关于flash - 在 Flash 9、Actionscript 3 中播放短声音的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/227674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com