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

标签 ios cocos2d-iphone core-audio audiounit

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

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

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

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

如果我使用 CocosDension::SimpleAudioEngine ,我相信我可以做我想做的事情的一半。也就是说,如果我只有 Music 和 Effects 轨道,我可以分别调整它们的音量,并使用适当的方法来播放背景音乐和效果,以及我想要的所有选项。如果我只有环境音轨和旁白音轨,情况也是如此,这让我想知道是否有可能绕过 SimpleAudioEngine 的单例架构,这样我就可以拥有两个实例,从而拥有两对 BG/FX 音轨。

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

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

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

最佳答案

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

关于ios - iOS/Cocos2d 中的哪个音频 API 最适合复杂的混音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196169/

相关文章:

macos - 如何启用/禁用聚合 CoreAudio 设备的输入或输出 channel ?

objective-c - 在应用程序内播放音乐

ios - 为文件添加前缀以避免外部框架之间的符号冲突

ios - Coreplot 注释绘制在轴上

html - 防止屏幕内容调整移动 safari 上的页面大小

ios - 带有 Indy 或第三方 Internet 组件的 iOS 上的 Delphi XE2

c++ - cocos2d-x 如何暂停层的 Action 和调度,然后恢复它们

iPhone:使用音频单元更改播放速度

opengl-es - 如何使用 Cocos2D 中的纹理绘制线条

iphone - Cocos2d iPhone非矩形 Sprite 触摸检测