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 构建错误