iOS 10.2 上的 Swift 3:如何从麦克风订阅单个样本?需要实时处理音频

Posted

技术标签:

【中文标题】iOS 10.2 上的 Swift 3:如何从麦克风订阅单个样本?需要实时处理音频【英文标题】:Swift 3 on iOS 10.2: How can I subscribe to individual samples from the microphone? Need to process audio in realtime 【发布时间】:2017-03-10 20:47:08 【问题描述】:

我正在尝试为 ios 10.2 构建一个应用程序,该应用程序通过实时处理麦克风输入来工作。出于此应用程序的目的,我需要能够在每次麦克风接收到 PCM 音频时对每个单独的样本进行计算。

我有一个使用 AudioUnits 和 AVAudioSession 的麦克风原型,它每隔几毫秒使用 AURenderCallback 函数轮询麦克风,并提取自上次采样以来收集的样本,但这对于我的用例来说太慢且不可靠。

每次麦克风录制一个音频样本时,我是否可以处理类似事件来提取样本然后执行我的代码?我该怎么做?

【问题讨论】:

【参考方案1】:

如果您发现 iOS 音频渲染回调不可靠,您可能在代码中做错了什么(试图对每个样本进行过多处理,或者在音频单元回调之外使用它们等)请参阅我的示例 RemoteIO在这个RecordAudio.swift gist记录代码。

较旧的 iOS 设备可能会限制为至少 5.8 毫秒的缓冲区,或者当应用处于后台时甚至更长。在较新的 iOS 设备上,您可能能够为少至 16 个样本获得可靠的渲染回调。但是没有理由经常处理样本,因为 iOS 硬件 IO DMA 以及 ADC 和 DAC 的延迟可能比 16 个样本要长得多,并且显示仅以 60 Hz 更新。

【讨论】:

非常感谢您的反馈。实际上,我偶然发现了您的示例,并在发布此问题后通过实验发现了采样的下限。最后发现我可以为我的应用程序非常可靠地处理多达 28 个样本,设置一个样本队列并将它们从队列中拉出,以便在足够接近实时的情况下使用我需要做的事情。感谢您在这里和社区其他人提供的所有有用的建议。在环顾四周时,我一直在偶然发现您的帖子和代码,并且一直在学习很多关于 DSP 的知识。

以上是关于iOS 10.2 上的 Swift 3:如何从麦克风订阅单个样本?需要实时处理音频的主要内容,如果未能解决你的问题,请参考以下文章

如何从麦克风实时获取原始音频帧或从 iOS 中保存的音频文件获取原始音频帧?

CLLocationManager 未在 iOS 10.2 [Swift] 中调用 didUpdateLocation()

Swift 3:如何在使用 AVFoundation 录制视频期间将麦克风静音/取消静音

在 Xcode 10.2 上的 Swift4.2 中插入 NSManagedObject 后,我​​会立即收到 Xcode 构建错误

swift 3 FFT获取声音m4a的频率

如何从 BMPLayer iOS Swift 中删除视频上的暗层?