3

我正在使用 cocos2d 开发一个电影 iPad 应用程序,我想要比大多数高级音频 API 提供的更多控制。在 cocos2d 和 iOS SDK 中,我可以访问 CocosDension(实际上是三个功能略有不同的 API)和 CoreAudio(还包含多个不同级别和功能的 API)。我正在尝试找出哪些 API 将支持我需要的功能,我可以使用一些帮助。

  • 我的应用需要 4 个音轨,每个音轨都有一个可由用户控制的单独播放音量:
    • 背景音乐
    • 环境声
    • 旁白
    • 声音特效

音乐和环境音轨需要从磁盘播放 1-4 分钟长的立体声循环。我需要能够预加载、开始/停止、循环、淡入/淡出以及调整这些曲目的播放音量。暂停对于这两个曲目并不重要,因为它们会在菜单启动时继续在后台播放。

旁白轨道需要一次播放一个单声道文件,长度为 30-60 秒,平移中心。效果音轨需要同时播放多个 1-5 秒的单声道文件混合成一个立体声声场。每个正在播放的剪辑都应该能够被预加载、开始/停止,并且可以调整其音高、增益和声像。这两个曲目的播放应该可以暂停/恢复。

如果我使用 CocosDension:: SimpleAudioEngine,我相信我可以做到我想要的一半。也就是说,如果我只有音乐和效果音轨,我可以单独调整它们的音量,并使用适当的方法播放背景音乐和效果,并提供我想要的所有选项。如果我只有 Ambient 和 Narration 音轨,情况也是如此,这让我想知道是否可以绕过 SimpleAudioEngine 的单例架构,这样我就可以有两个实例,即两对 BG/FX 音轨。

如果可以同时播放两个背景音轨,我可以牺牲单独调整音乐/环境音量并将旁白轨道合并到效果中的能力(在声音剪辑级别控制其音量)。我真的很想通过单独的音量旋钮让用户可以调节音乐和环境声音。有没有办法在 CocosDension 中实现这一点?

如果我使用 CoreAudio,Multichannel Mixer AudioUnit 似乎是完成我的音量控制目标的完美之选。然而,使用它似乎需要我设置大量的低级缓冲区和音频信号路径代码。除非我错了,否则为了支持我在 CocosDension 中免费获得的所有东西(32 个同时播放声像、音高和增益控制 + 背景音乐的效果),我需要构建一个音频处理图,例如:

[Custom Audio Rendering Code ]   [Multichannel Mixer Unit]---->[Output Unit]
 | musicRenderCallback()----|---->| bus 0: "Music"      |
 | ambientRenderCallback()--|---->| bus 1: "Ambient"    |
 | narrationRenderCallback()|---->| bus 2: "Narration"  |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~+     | bus 3: "Effects"    |<----+
 |                                +---------------------+     |
 |                                                            |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~+    [Multichannel Mixer Unit]----+
 | effectsRenderCallback0()-|---->| bus 0: "Effects0"   |
 | effectsRenderCallback1()-|---->| bus 1: "Effects1"   |
 | ...                      |     | ...                 |
 | effectsRenderCallback31()|---->| bus 31: "Effects31" |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~+     +---------------------+
 | audioQueueBuffers[35]    |
 +--------------------------+

从实现的角度来看,这似乎相当复杂。有没有更简单的方法,可能将 CocosDenshion 和 CoreAudio API 混合在一起?他们在同一个游泳池里玩得好吗?

4

1 回答 1

3

不幸的是,答案肯定是低级 CoreAudio。MultichannelMixer 正是为这种工作而设计的。复杂性实际上仅取决于您想要支持的最旧的 iOS 版本,因为在最新版本中它变得更加容易,因为 Apple 一直在添加新的 AudioUnits,它可以处理您之前需要自己实现的一些任务。如果您需要支持没有开箱即用的文件播放器 AudioUnits 的 iOS 版本,有几个 3rd 方开源示例代码为您包装了 ExtFileReader 和渲染回调函数,因此可以有效地用作文件阅读器 AudioUnit。这将大大简化您实现图形的任务,好像我没有弄错这种方式,您不需要自己实现任何渲染回调。

于 2011-09-29T06:06:47.480 回答