iOS:音频单元 vs OpenAL vs Core Audio

Posted

技术标签:

【中文标题】iOS:音频单元 vs OpenAL vs Core Audio【英文标题】:iOS: Audio Units vs OpenAL vs Core Audio 【发布时间】:2011-04-30 04:48:59 【问题描述】:

有人可以向我解释一下 OpenAL 如何适应 iPhone 上的声音模式吗?

似乎有不同级别的 API 用于处理声音。更高层次的很容易理解。

但我的理解越来越模糊。有 Core Audio、Audio Units、OpenAL。

这些之间有什么联系? openAL 是底层,核心音频(包含作为其较低级别对象之一的音频单元)的基础吗?

Xcode 似乎没有记录 OpenAL,但我可以运行使用其功能的代码。

【问题讨论】:

Great overview here 【参考方案1】:

Core Audio 涵盖了很多内容,例如读取和写入各种文件格式、在编码之间进行转换、从流中提取帧等。其中大部分功能都被收集为“音频工具箱”。 Core Audio 还提供了多个 API 用于处理音频流、播放、捕获或两者兼而有之。最低级别的一个是音频单元,它与未压缩 (PCM) 音频一起使用,并且有一些用于应用效果、混音等的好东西。在音频单元上实现的音频队列要容易得多,因为它们可以处理压缩格式(不仅仅是PCM)并让您免于一些线程挑战。 OpenAL 也在音频单元之上实现;您仍然必须使用 PCM,但至少线程并不可怕。不同之处在于,由于它不是来自 Apple,它的编程约定与 Core Audio 和 ios 的其余部分完全不同(最明显的是,它是一个推送 API:如果你想使用 OpenAL 进行流式传输,你可以轮询你的源以查看它们是否已经用尽他们的缓冲区并推入新的缓冲区;相比之下,音频队列和音频单元是基于拉的,因为当播放需要新样本时,您会收到回调)。

如您所见,更高级别是好东西,例如 Media Player 和 AV Foundation。如果您只是播放文件,这些会容易得多,但如果您想做某种效果、信号处理等,可能不会给您足够深入的访问权限。

【讨论】:

【参考方案2】:

这是我想出来的:

底层是Core Audio。具体来说,音频单元。

所以音频单元构成了基础层,一些低级框架已经建立在此之上。整个 caboodle 被称为 Core Audio。

OpenAL 是一个多平台 API —— 创建者试图反映 OpenGL 的可移植性。一些公司正在赞助 OpenAL,包括 Creative Labs 和 Apple!

所以 Apple 提供了这个 API,基本上是作为 Core Audio 的薄包装。我猜这是为了让开发人员轻松地提取代码。请注意,这是一个不完整的实现,所以如果你想让 OpenAL 做一些 Core Audio 可以做的事情,它会做的。但否则它不会。

有点违反直觉——仅查看源代码,看起来 OpenAL 的级别较低。不是这样!

【讨论】:

+1,不错的总结。我想补充一点,根据我的经验,OpenAL 在 iOS 上有点不稳定,如果可能的话应该避免。 CoreAudio 并不容易,但那是因为一般的音频处理并不容易,但至少它工作起来非常可靠。 我使用 OpenAL 取得了不错的效果,Cocos2D 也使用它。我不知道它不是最低级别的 API,我必须说我有点恼火! 还有一个可能有用的知识:“3D Mixer [音频] 单元是构建 OpenAL 的基础”——来自 Apple Docs:developer.apple.com/library/ios/#DOCUMENTATION/MusicAudio/…

以上是关于iOS:音频单元 vs OpenAL vs Core Audio的主要内容,如果未能解决你的问题,请参考以下文章

IOS音频1:之采用四种方式播放音频文件AudioToolbox AVFoundation OpenAL AUDIO QUEUE

CoreAudio/OpenAL:如何获取传出的音频信号

在 Android 上使用 OpenAL 进行音频录制

几种播放音频文件的方式(十三) —— OpenAL框架之分步解析

修改OBS为仅直播音频

iOS 音频系列之一:Core Audio简介