我正在使用cocos2d开发一个电影iPad应用程序,我想要比大多数高级音频API提供的更多控制。在cocos2d和iOS SDK中,我可以访问CocosDension(实际上是三个功能略有不同的API)和CoreAudio(它还包含多个不同级别和功能的API)。我试图弄清楚哪些API将支持我需要的功能,我可以使用一些帮助。
音乐和环境音轨需要播放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混合在一起?他们在同一个游泳池玩得好吗?
答案 0 :(得分:3)
不幸的是,答案肯定是低级CoreAudio。 MultichannelMixer就是为这种工作而设计的。复杂性实际上仅取决于您想要支持的最古老的iOS版本,因为在最新版本中,Apple已经变得更容易,因为Apple已经添加了新的AudioUnit,它负责处理您之前需要执行的一些任务。如果您需要支持没有开箱即用的文件播放器AudioUnit的iOS版本,那么有几个第三方开源示例代码可以为您包装ExtFileReader和渲染回调函数,因此可以有效地用作文件阅读器AudioUnit。这将大大简化您实现图形的任务,就好像我没有弄错,你不需要自己实现任何渲染回调。