2016-01-15 46 views
1

我需要以8kHz的采样率(大约)1秒钟来分析音频数据块。尽管音频将被实时录制,但它只会用于检测特定事件。因此,没有严格的等待时间要求。这种情况下最好的框架是什么?如何获取用于分析核心音频或AVFoundation的音频块

我已经开始学习Core Audio,并且学习了Core Audio。通过互联网上最少量的Swift文档,我可以设置AUGraph for iOS来使用远程I/O音频单元录制音频,并通过输出呈现回调访问原始样本。不幸的是,我坚持要创建1秒的音频样本块来执行音频分析。可以使用自定义的AudioBufferList吗?或者是否可以在远程I/O音频单元上实现大型铃声缓冲器(如果是HAL音频单元,则需要它)?

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

我希望对此有任何建议。

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

回答

1

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

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

该戒指记录最后N秒的指定。旧数据被新数据覆盖。所以你指定你想记录最近的3秒钟。我演示的样本在通过麦克风进行录制时播放正弦波。每隔7秒钟,它抓取录制音频的最后2秒钟。

Here is the complete sample code on github

+1

这非常有帮助!非常感谢。根据您的评论以及我在Swift中使用Core Audio的经验,我只是决定切换到Objective-C。尽管我通过“学习Core Audio”工作,但我可能需要更多地提高我的Objective-C技能,但我一定会尝试更详细地了解您的代码。现在我想知道你实现的ringbuffer和Apple的CARingBuffer以及Michael Tyson的TPCircularBuffer是否有很大的区别? – Gerard

+0

自从我看了TP以来已经有一段时间了。但通常泰森先生写的东西都很好。我没有看过CA,但我确信它是稳定的。 大多数环形缓冲区允许您“消耗”并删除缓冲区(FIFO)中的最早数据。所以从环中读取得到最老的数据。矿山工作在最新的数据。它在2秒前和现在之间获得数据。假设你有一个6秒的缓冲区。我的读取得到了第4到第6秒,其他环形缓冲区实现的秒数从0到2,所以我就像一个LIFO。 如果您没有任何实时限制,TP或CA可能正常工作。 – jaybers

+0

我终于完成了你的代码,并且我很了解它。但是,在运行代码时,播放不起作用(只是正弦波)。我观察到渲染回调(outRenderProc)中没有AudioUnitRender从系统输入(只是正弦波发生器)中绘制。但是当我添加AudioUnitRender时没有任何改变。可能是因为interruptListener配置不正确?我试图修改它,但无法使其工作。我希望你能对此发表评论。 – Gerard

2

为了分析1秒的音频采样窗口,最简单的解决方案是使用带有无锁环形缓冲区的音频队列API(大约2秒钟)来记录采样。您可以使用重复的nstimer任务来轮询缓冲区的完整程度,并在处理任务可用时发出1秒的块。

核心音频和RemoteIO音频单元用于如果您需要更短的数据窗口,延迟要求几毫秒。

+0

这很清楚。因为我可能想在未来进行实时音频处理,所以我认为音频单元对我来说是最适合的。尽管你的答案很有用,但由于示例代码,我接受了另一个答案(不幸的是,我不能同时接受这两个答案)。 – Gerard

相关问题