【问题标题】:Large number of Sound Effects with SimpleAudioEngine使用 SimpleAudioEngine 的大量音效
【发布时间】:2011-12-08 12:07:50
【问题描述】:

背景: 我的背景音乐正在作为音效播放,因为我想在每次重复曲调之间改变音高。

问题: 在播放背景音乐时,还会发生许多其他短音效。播放一定数量的音效后,我的背景音乐(也是音效)会中断。队列似乎是循环的,所以在播放了 50 个音效之后,当播放第 51 个时,无论是否完成,第一个都会被释放。

请求指导: 我可以看到两个方向可能会解决这个问题。 1.不将背景音乐作为效果播放,并弄清楚如何将音高更改为背景音乐而不是效果 2. 一些如何确保效果会一直保留到完成。

谢谢

【问题讨论】:

    标签: cocos2d-iphone simpleaudioengine


    【解决方案1】:

    SimpleAudioEngine 不允许您控制通道,因此它只会在其内部分配的通道之一中播放您的音效。最终所有频道都在播放音频。在这种情况下,当要播放一个新的音频文件并且所有通道都已经在播放时,SimpleAudioEngine 将取消一个现有的音频文件。有时这将是您的背景音乐。当当。

    解决此问题的通常方法是专门为背景音乐分配(分配)一个音频通道。没有其他音频会尝试在该频道上播放音频。您将不得不使用“常规”CocosDenshion API。看来您需要使用CDAudioManager 或CDSoundEngine,但我没有使用 CocosDenshion 的频道的经验。

    我个人从未使用过 CocosDenshion,每当我需要更多控制时,我发现 ObjectAL API 更易于理解,并且它具有出色的文档。我为在特定通道上播放声音的 ObjectAL 制作了以下辅助函数。我只是为我的背景音乐实例化了ALChannelSource,并且只通过该频道播放背景音乐。返回的ALSoundSource 甚至允许您在播放音频时更改音高、平移等。

    +(id<ALSoundSource>) playEffect:(NSString*)effect channel:(ALChannelSource*)channel loop:(bool)loop
    {
        id<ALSoundSource> soundSource = nil;
    
        if (channel)
        {
            ALBuffer* buffer = [[OALAudioSupport sharedInstance] bufferFromFile:effect];
            soundSource = [channel play:buffer loop:loop];
        }
    
        return soundSource;
    }
    

    我正在通过OALSimpleAudio 类播放的所有其他音频文件。

    【讨论】:

    • 啊,我明白了。 SimpleAudioEngine 有点太简单了,嗯?感谢您提供全面的答案,我会试一试并报告。
    • OALAudioSupport 来自哪里?
    • 你的意思是在哪里可以获得 ObjectAL?这里:kstenerud.github.com/ObjectAL-for-iPhone
    • 我在将 ObjectAL 添加到我的项目时遇到了一些重大问题。不过,您对频道的指导很到位,而且很有帮助。我最终使用 CDAudioManager 实现。谢谢。
    • @LearnCocos2D,该代码似乎不再有效。 OALAudioSupport 类似乎已从 ObjectAL 的最新稳定版本中删除。我已经将 GameSoundManager(我最初从 CocosDension 演示应用程序中获得(我认为)迁移到使用 ObjectAL。虽然我发现从一个背景音轨过渡到另一个背景音轨有点问题,但它非常轻松。我还注意到使用 ObjectAL 运行,声音可能会受到设备与主机 Mac 上的调试器之间的通信的负面影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2012-01-22
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多