AS3中的声音延迟

时间:2011-04-16 22:38:01

标签: actionscript-3 audio flash-cs5

我正在从游戏库中动态触发短音(特别是Air for Android)。当用户单击按钮时,声音可能需要600毫秒才能实际播放。 我通过调用声音来设置它在实际声音之前的任何静音:

private var channel:SoundChannel = new SoundChannel();
private var buttonClickSound:Sound = new button_click();

public function buttonDownClick() {
    channel = buttonClickSound.play(63);
}

仍然有一个荒谬的延迟。

我尝试过的事情: 将MP3转换为wav 将声音片段放在时间线中 从urlLoader调用Sound Clip

全部返回相同的结果。我知道这里有一些话题可以谈论这个,但没有一个提供了我能找到的真正解决方案。有没有办法缓存声音或将其存储在缓冲区中?

谢谢你的期待。

2 个答案:

答案 0 :(得分:2)

重要更新

用于Android功能的Flash CS5 AIR从未出现过测试版。令人遗憾的是,随着adobe的出名,Flash CS5的功能已经停止,因此完整的工作/更新版本将成为CS6或CS5.5的销售功能。作为一个在adobe产品上花费了数千美元的客户,我对此有很多很多的感受,但我会保留这些信息,而不是我的对adobe 感情的狂热。为了证明这一点,请参阅:

http://labs.adobe.com/technologies/flashpro_extensionforair/

所以很可能这是CS5中AIR for android中未修复的许多错误之一。这并不奇怪,因为当我购买承诺AIR 1.5的CS4主集合时,甚至AIR 1.5仍然被破坏并且所有错误修复都被转换为2.0,这仅适用于CS5。他们从未在CS4 AIR 1.5中修复过的最大错误之一是webkit中一个主要的,严重的错误,它几乎使AIR中的webkit无法使用。事实上,当我在Webkinz.com工作时,一个重大的项目完全抛到窗外,我实际上被嘲笑建议使用AIR,吹嘘它的惊人之处然后当这些bug出现时,在我所有同行面前看起来像个白痴。从字面上看,我不是在开玩笑,而是在180多名开发师部门的负责人,围着一个巨大的桌子与我公司的每个主要参与者进行会面。

无论如何,也许我的更新确实流下了一些咆哮,但这是我认为的好信息,也是一个值得学习的好教训,这总是假设Adobe产品最糟糕。幸运的是,正如我在回答中提到的那样,这不是一个死胡同,并且有很多方法围绕他们的“商业模式”。

原始答案

这是AIR for Android中的一个错误:

http://forums.adobe.com/thread/753977

那篇文章已经过时了,但我在同一时间框架内看到了更多,并且我已经把它称为事实了。你有更新闪存CS5? (转到帮助 - >更新)。说实话,我甚至不知道他们是否已修补/解决了这个问题,但最好的办法是找到最新的Flex SDK并尝试使用它手动将SWF打包成APK。说明:

http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac25d3d8c712b2d86751e-8000.html#WS901d38e593cd1bac25d3d8c712b2d86751e-7ffb

更详细/类似教程的说明:

http://thulasiramsoft.wordpress.com/2011/01/16/build-apps-for-android-using-as3-without-a-device-using-flex-air/

如果这是一个错误,那么您将首先看到修复程序出现。尝试使用上述方法手动将SWF打包到APK中,并确保已将设备上的AIR for Android更新为AIR 2.6(最新版本,只需进入市场进行更新)。这可以解决问题,也可以在编译器和运行时都消除它。

答案 1 :(得分:0)

声音延迟是Flash导出到AIR的错误。

简单的方法是播放一些背景音乐,然后声音设备不会进入睡眠状态。如果你不想要音乐,你可以永远播放一些无声的声音。这解决了其他短音的声音延迟问题。

[Embed(source="sfx.mp3")]
const snd_sfx:Class;

const sfx:Sound = new snd_sfx();

const SilentSoundTransform:SoundTransform = new SoundTransform(0);

function playSoundSilentlyEndlessly(evt:Event = null):void
{
    sfx.play(0, 1000, SilentSoundTransform).addEventListener(Event.SOUND_COMPLETE, playSoundSilentlyEndlessly, false, 0, true); // plays the sound with volume 0 endlessly
}

playSoundSilentlyEndlessly();