我需要以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中获取所有内容。我很好奇这是否会是一个更好的时间投资?
这非常有帮助!非常感谢。根据您的评论以及我在Swift中使用Core Audio的经验,我只是决定切换到Objective-C。尽管我通过“学习Core Audio”工作,但我可能需要更多地提高我的Objective-C技能,但我一定会尝试更详细地了解您的代码。现在我想知道你实现的ringbuffer和Apple的CARingBuffer以及Michael Tyson的TPCircularBuffer是否有很大的区别? – Gerard
自从我看了TP以来已经有一段时间了。但通常泰森先生写的东西都很好。我没有看过CA,但我确信它是稳定的。 大多数环形缓冲区允许您“消耗”并删除缓冲区(FIFO)中的最早数据。所以从环中读取得到最老的数据。矿山工作在最新的数据。它在2秒前和现在之间获得数据。假设你有一个6秒的缓冲区。我的读取得到了第4到第6秒,其他环形缓冲区实现的秒数从0到2,所以我就像一个LIFO。 如果您没有任何实时限制,TP或CA可能正常工作。 – jaybers
我终于完成了你的代码,并且我很了解它。但是,在运行代码时,播放不起作用(只是正弦波)。我观察到渲染回调(outRenderProc)中没有AudioUnitRender从系统输入(只是正弦波发生器)中绘制。但是当我添加AudioUnitRender时没有任何改变。可能是因为interruptListener配置不正确?我试图修改它,但无法使其工作。我希望你能对此发表评论。 – Gerard