首页 文章

核心音频指导/入门

提问于
浏览
3

我正在为 ios 4 阅读核心音频,目的是构建一个小测试应用程序。

在研究所有 api 的时候,我很困惑。理想情况下,我想知道如何做的是将两个 mp3 中的大量样本提取到数组中。

然后在回调循环中,我想将这些样本混合在一起并将它们发送给扬声器。

苹果开发网站上有一些例子,但我发现它们难以消化和消化。有人知道某处有一个很好的剥离示例吗?

此外,我无法确定使用哪个 api。

有 extendedaudiofile 和音频文件。这些似乎是提取音频的人。我应该使用哪一个?

使用混合单元是绝对必要的,或者我可以自己做混合代码(我希望尽可能多的样本控制)。

我需要使用音频队列服务吗?我听说他们提供的延迟很差,这是真的吗?

最后我必须使用音频会话服务。一个音频应用程序没有它吗?音频会话如何适应整个音频提取和回调?它纯粹只是处理中断吗?

2 回答

  • 5

    关于 Core Audio 的文档在过去几年中已经有了很大的改进,但它仍然不完整,有时令人困惑,有时甚至是错误的。我发现框架结构本身很混乱(AudioToolbox,AudioUnit,CoreAudio,......什么是什么?)。

    但是我解决你的任务的建议是这样的(警告:我没有在 iOS 中完成以下操作,只有 MacOS,但我认为它大致相同):

    • 使用 ExtendedAudioFile(在 AudioToolbox 框架中声明)来读取 mp3。它正如名称所暗示的那样,它扩展了 AudioFile 的功能。 I.e。您可以将音频流格式(AudioStreamBasicDescription)分配给 eaf,当您从中读取时,它将为您转换为该格式(使用音频单元进一步处理您使用格式 ID'kAudioFormatLinearPCM'和格式标志'kAudioFormatFlagsAudioUnitCanonical') 。

    • 然后,使用 ExtAudioFile 的'ExtAudioFileRead'将转换后的音频读入 AudioBufferList 结构,该结构是 AudioBuffer 结构的集合(均在 CoreAudio 框架中声明),每个通道一个(通常为两个)。有关 AudioStreamBasicDescription,AudioBufferList 和 AudioBuffer 等内容,请查看文档“音频”部分中的“核心音频数据类型参考”。

    • 现在,使用音频单元播放和混合文件,这并不难。音频单元似乎是“大事”但它们确实不是。查看'AudioUnitProperties.h'和'AUComponent.h'(在 AudioUnit 框架中)以获取可用音频单元的描述。在文档中查看“适用于 iOS 的音频单元托管指南”。这里唯一的问题是 iOS 没有音频文件播放器单元...如果我没记错的话,你必须手动为你的音频单元提供样本。

    • 音频单元位于 AUGraph 中(在 AudioToolbox 框架中声明),并通过 patchbay 互连,如音频硬件。该图表还为您处理音频输出。你可以查看关于这个的'PlaySoftMIDI'和'MixerHost'示例代码(实际上,我刚看了一下 MixerHost,我想,这正是你想要做的!)。

    经验法则:查看头文件!他们提供比文档更完整和更准确的信息,至少这是我的印象。查看上述框架的标题并尝试熟悉它们可以帮助很多。

    此外,还有一本关于 Core Audio 的书(Kevin Avila 和 Chris Adamson 的'Core Audio'),但它还没有发布。

    希望,这一切都有所帮助!祝你好运,塞巴斯蒂安

  • 0

    有 extendedaudiofile 和音频文件。这些似乎是提取音频的人。我应该使用哪一个?

    如果您访问存储在 iPod 库中的音频文件,这些都不会起作用。你必须使用AVAssetReader。 (注意:在 AVAssetReader 文档中..它声明AVAssetReader is not intended for use with real-time sources, and its performance is not guaranteed for real-time operations.所有我可以说它对我来说工作正常..我使用 AVAssetReader 创建了几个实时应用程序.. 这里是一个示例。

    有关 iOS 音频编程的更多一般提示,请参阅我的答案这里

    最后,书学习核心音频现在显然已经发布了。我强烈建议您耐心地阅读这些章节并使用示例代码。最好花些时间阅读示例,并在跳过更复杂的场景之前将概念放入其中...复制并粘贴来自 Web 的示例代码 and/or 遵循网络上人们的高级建议可能会在开始时起作用,但是你以后会遇到真正毛病的问题,没有人能帮你解决问题。相信我,我学到了很多东西!

相关问题