如何获取音频块以在核心音频或 AVFoundation 中进行分析

How to obtain audio chunks for analysis in core audio or AVFoundation

我需要分析(大约)1 秒的音频数据块,采样率为 8kHz。虽然音频会被实时录制,但它只会用于检测特定事件。因此,没有严格的延迟要求。在这种情况下最好使用什么框架?

我已经开始学习 Core Audio 并且学习了 Learning Core Audio 这本书。借助互联网上可用的最少量 Swift 文档,我能够为 iOS 设置 AUGraph 以使用远程 I/O 音频单元录制音频并访问原始样本与输出渲染回调。不幸的是,我不得不创建 1 秒的音频样本块来执行音频分析。可以为此使用自定义 AudioBufferList 吗?或者可以在远程 I/O 音频单元上实现一个大的环形缓冲区(就像 HAL 音频单元所需要的那样)?

我也试过用AVFoundation和AVAssetReader来获取音频块。虽然我能够获得录制音频信号的样本,但我没有成功创建 1 秒的缓冲区(我什至不知道是否可以实时执行此操作)。无论如何,AVFoundation 在这种情况下会是一个不错的选择吗?

如有任何建议,我将不胜感激。

我的一个主要问题是我尝试使用 Swift 但没有太多可用的示例代码,而且文档更少。我觉得音频节目切换到Objective-C会更好,不要再试图在Swift中获取所有内容。我很好奇这是否是更好的时间投资?

要分析 1 秒 windows 的音频样本,最简单的解决方案是使用音频队列 API 和 lock-free 环形缓冲区(比如大约 2 秒长)来记录样本。您可以使用重复的 nstimer 任务来轮询缓冲区的填充程度,并在可用时将 1 秒的块发送给处理任务。

Core Audio 和 RemoteIO Audio Unit 适用于如果您需要更短的数据 windows 并且延迟要求大约为几毫秒。

核心音频是 C API。 Objective-C 是 C 的扩展。我发现 Objective-C 比 swift 更适合处理核心音频。

我创建了一个跨平台的 c 无锁环形缓冲区。有演示设置环、设置麦克风、播放音频以及从环读取和写入的示例代码。

铃声记录您指定的持续N秒数。旧数据被新数据覆盖。因此,您指定要记录最近的 3 秒。我展示的示例在通过麦克风录音时播放正弦波。每 7 秒,它会抓取录制音频的最后 2 秒。

Here is the complete sample code on github.