Ios 如何在core audio或AVFoundation中获取音频块进行分析

Ios 如何在core audio或AVFoundation中获取音频块进行分析,ios,audio,avfoundation,core-audio,Ios,Audio,Avfoundation,Core Audio,我需要分析(大约)1秒的音频数据块,采样率为8kHz。虽然音频将实时录制,但它将仅用于检测特定事件。因此,没有严格的延迟要求。在这种情况下,最佳的框架是什么 我已经开始学习核心音频,并完成了《学习核心音频》一书。通过互联网上提供的少量Swift文档,我能够为iOS设置一个AUGraph,用远程I/O音频单元录制音频,并通过输出渲染回调访问原始样本。不幸的是,我不得不创建1秒钟的音频样本块来执行音频分析。是否可以为此使用自定义AudioBufferList?或者可以在远程I/O音频单元上实现一个大

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

我已经开始学习核心音频,并完成了《学习核心音频》一书。通过互联网上提供的少量Swift文档,我能够为iOS设置一个AUGraph,用远程I/O音频单元录制音频,并通过输出渲染回调访问原始样本。不幸的是,我不得不创建1秒钟的音频样本块来执行音频分析。是否可以为此使用自定义AudioBufferList?或者可以在远程I/O音频单元上实现一个大的环形缓冲区(就像在HAL音频单元的情况下一样)

我还尝试采用AVFoundation和Avassetrader来获取音频块。虽然我能够获得录制的音频信号的样本,但我没有成功地创建1秒的缓冲区(我甚至不知道是否可以实时执行此操作)。在这种情况下,AVFoundation会是一个好的选择吗

如果您能给我一些建议,我将不胜感激


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

对于分析1秒的音频样本窗口,最简单的解决方案是使用音频队列API和无锁环形缓冲区(大约2秒长)来记录样本。您可以使用重复的nstimer任务轮询缓冲区已满的程度,并在可用时向处理任务发出1秒的块

Core Audio和RemoteIO Audio单元适用于需要更短数据窗口且延迟要求为几毫秒的情况。

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

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

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


.

这非常有用!谢谢。基于您的评论和我在Swift中使用核心音频的经验,我刚刚决定切换到objective-C。虽然我通过“学习核心音频”进行了工作,但我可能需要更多地提高我的objective-C技能,但我一定会尝试更详细地理解您的代码。现在我想知道您实现的ringbuffer与Apple的CARingBuffer和Michael Tyson的TPCircularBuffer之间是否有重大区别?我已经有一段时间没有研究TP了。但一般来说,泰森先生写的任何东西都是好的。我没看过CA,但我肯定它是实心的。大多数环形缓冲区允许您“使用”并删除缓冲区中最早的数据(FIFO)。因此,从环中读取的数据将获得最早的数据。我的工作基于最新的数据。它从2秒前到现在获取数据。假设您有一个6秒的缓冲区。我的读取时间为4到6秒,而其他环形缓冲区实现时间为0到2秒。所以我的就像后进先出。如果您没有任何实时限制,TP或CA可能可以正常工作。我终于看完了您的代码,并且我相当理解它。但是,在运行代码时,播放不起作用(只是正弦波)。我注意到在渲染回调(outRenderProc)中没有AudioUnitRender可以从系统输入中绘制(只有正弦波生成器)。但是当我添加AudioUnitRender时,没有任何变化。可能是中断侦听器配置不正确吗?我试图修改它,但无法使其工作。我希望你能对此发表评论。你想从麦克风中获取音频吗?如果没有,您的音频源在哪里?扬声器是否播放任何内容?我发现问题似乎与I/o AU输入范围上的立体声流格式有关。当我在render回调中设置AudioUnitRender而不是正弦波时,不会播放音频(尽管它适用于单声道流格式)。我的问题是将输入样本复制到输出通道,以便可以立体声播放。我放了一个新的。也许,你也可以在这里帮助我,但是你的代码对我理解材料有很大帮助!这是清楚的。因为我将来可能想做实时音频处理,所以我认为音频单元对我来说是最好的。虽然您的答案很有用,但由于示例代码的缘故,我接受了另一个答案(不幸的是,我不能同时接受这两个答案)。