iOS 音频单元:啥时候需要使用 AUGraph?
Posted
技术标签:
【中文标题】iOS 音频单元:啥时候需要使用 AUGraph?【英文标题】:iOS Audio Units : When is usage of AUGraph's necessary?iOS 音频单元:什么时候需要使用 AUGraph? 【发布时间】:2011-07-18 15:36:54 【问题描述】:我对 ios 编程完全陌生(我更像是一个 android 人..),并且必须构建一个处理音频 DSP 的应用程序。 (我知道这不是接触 iOS 开发的最简单方法;))
应用需要能够接受来自以下的输入:
1- 内置麦克风 2- iPod库
然后可以将过滤器应用于输入声音,并将结果输出到:
1- 扬声器 2- 记录到文件
我的问题如下:为了能够将多个过滤器应用于输入,或者是否可以通过处理具有不同渲染回调的样本来应用这些不同的效果,是否需要 AUGraph?
如果我使用 AUGraph,我是否需要:每个输入需要 1 个音频单元,输出需要 1 个音频单元,每个效果/过滤器需要 1 个音频输入?
最后,如果我不可以,我只有 1 个音频单元并重新配置它以选择源/目标?
非常感谢您的回答!我迷失了这些东西......
【问题讨论】:
【参考方案1】:如果你愿意的话,你确实可以使用渲染回调,但是内置的音频单元很棒(还有一些事情在 NDA 等下我还不能在这里说,如果你说的话太多了可以访问 iOS 5 SDK 我建议你看看)。
您可以在不使用 AUGraph
的情况下实现您希望的行为,但是建议您这样做,因为它可以处理很多事情并节省您的时间和精力。
使用 AUGraph
来自Audio Unit Hosting Guide (iOS Developer Library):
AUGraph
类型为音频单元故事增加了线程安全性:它使您能够即时重新配置处理链。例如,您可以安全地插入均衡器,甚至在播放音频时为混音器输入交换不同的渲染回调函数。事实上,AUGraph
类型提供了 iOS 中唯一用于在音频应用中执行此类动态重新配置的 API。
Choosing A Design Pattern (iOS Developer Library) 详细介绍了如何选择如何实现音频单元环境。从设置音频会话、图形和配置/添加单元到编写回调。
至于您想要在图表中使用哪些音频单元,除了您已经说明的内容之外,您还需要一个 MultiChannel Mixer Unit(请参阅Using Specific Audio Units (iOS Developer Library))来混合您的两个音频输入,然后将混音器连接到 输出 单元。
直接连接
或者,如果您不使用 AUGraph 直接执行此操作,则以下代码是您自己将音频单元连接在一起的示例。 (来自Constructing Audio Unit Apps (iOS Developer Library))
您也可以在音频之间建立和断开连接 通过使用音频单元属性机制直接单元。为此, 使用
AudioUnitSetProperty
函数和kAudioUnitProperty_MakeConnection
属性,如清单2-6所示。 这种方法需要您定义一个 AudioUnitConnection 每个连接的结构都用作其属性值。
/*Listing 2-6*/
AudioUnitElement mixerUnitOutputBus = 0;
AudioUnitElement ioUnitOutputElement = 0;
AudioUnitConnection mixerOutToIoUnitIn;
mixerOutToIoUnitIn.sourceAudioUnit = mixerUnitInstance;
mixerOutToIoUnitIn.sourceOutputNumber = mixerUnitOutputBus;
mixerOutToIoUnitIn.destInputNumber = ioUnitOutputElement;
AudioUnitSetProperty (
ioUnitInstance, // connection destination
kAudioUnitProperty_MakeConnection, // property key
kAudioUnitScope_Input, // destination scope
ioUnitOutputElement, // destination element
&mixerOutToIoUnitIn, // connection definition
sizeof (mixerOutToIoUnitIn)
);
【讨论】:
您好,感谢您的回答!我已经读过你提到的内容。然后,我开始的项目将作为一个框架,其他学生将只添加新的 dsp 效果/过滤器,这就是为什么内置音频单元(remoteIO 除外)不是很有用的原因。我采取了稍微不同的方法。我只有一个 remoteIO 音频单元和一个渲染回调(“选择设计模式”的图 2.3),在其中我调用 AudioUnitRender 将麦克风渲染到 ioData 缓冲区。在渲染回调结束时,我可以使用将输出记录到文件中ExtAudioFileWriteAsync。处理可以在两者之间完成。 如果目的是成为编写音频效果的框架,您的方法可能已经足够并且更合适。渲染回调对此很有用。您还在问题中提到了从 iPod 库中获取输入,当处理多个输入然后使用时,您可能要考虑使用 AUGraph 至少用于混音器。 应用程序现在运行良好,我目前没有使用混音器,因为用户一次只能有一个活动源。我将与我的主管讨论将这两个来源混合在一起的可能性,如果有必要,我将使用图表和混音器。感谢您的建议!以上是关于iOS 音频单元:啥时候需要使用 AUGraph?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 的 AUGraph 中添加两个 I/O 音频单元?
连接节点错误 kAudioUnitErr_PropertyNotWriteable 时 AudioToolbox AUGraph 失败