iOS / Cocos2d中哪些音频API最适合复杂的混音?

时间:2011-08-25 19:35:59

标签: ios cocos2d-iphone core-audio audiounit

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

  • 我的应用程序需要4个音轨,每个音轨都有一个可由用户控制的单独播放音量:
    • 背景音乐
    • Ambient Sound
    • 叙事
    • 音效

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

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

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

如果可以同时播放两个背景音轨,我可能会牺牲分别调整音乐/环境音量的能力,并将叙述音轨合并到效果中(在声音剪辑级别控制音量)。我真的希望保持音乐和环境声音可由用户使用单独的音量旋钮调节。有没有办法在CocosDension中实现这一目标?

如果我使用CoreAudio,多声道混音器AudioUnit似乎是完成音量控制目标的最佳选择。但是,利用它似乎需要我设置大量的低级缓冲区和音频信号路径代码。除非我错了,为了支持我在CocosDension中免费获得的所有内容(32个同时播放音频,音调和增益控制+背景音乐)我需要构建一个类似于:< / p>

[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混合在一起?他们在同一个游泳池玩得好吗?

1 个答案:

答案 0 :(得分:3)

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