AudioUnit 每 30 秒录制一次故障

Posted

技术标签:

【中文标题】AudioUnit 每 30 秒录制一次故障【英文标题】:AudioUnit recording glitches every 30 seconds 【发布时间】:2017-08-16 14:20:11 【问题描述】:

我已使用此示例代码创建了一个录音机。 http://www.stefanpopp.de/capture-iphone-microphone/

我发现我大约每 30 秒就会出现一次故障。它们对我来说听起来有点像缓冲区故障,尽管我可能是错的。我曾尝试联系文章的作者,但没有取得多大成功。我真的很难遵循其中的一些代码。我认为它缺少一个循环缓冲区,但我不确定它在这里有多重要。我希望有人可以为我指明正确的方向:

向我指出一些不同的示例代码或建议我需要添加的内容(高级建议很好 - 我很乐意研究和完成工作,我只是不确定工作是什么)

建议一些更好的值用于缓冲区数据大小等方面。

告诉我这段代码没有任何问题,而且我的错误几乎肯定在其他地方。

建议一个我可以使用的库来处理它(Amazing Audio Engine 2 对我来说看起来不错,但我有点担心说明它已退役的说明。AudioKit 看起来也很棒,但它错过了一个高峰power reading, 导入这么复杂的库后自己实现真是太可惜了)

为什么我不使用 AVAudiosession?我需要用户能够在录制时设置麦克风电平并能够同时收听。以前我使用 AVAudioSession 执行此操作,但在更新的设备上 isInputGainSettable 返回 NO。对于通过闪电电缆插入的许多硬件麦克风,它也会返回 NO,现在我们越来越多地看到耳机插孔消失了。

【问题讨论】:

【参考方案1】:

几个问题。

Apple 建议不要在音频上下文(回调)中调用对象方法。您的代码有几个。请改用 C 函数。

较新的 iOS 设备可能使用 48000,而不是 44100 的硬件采样率。重新采样可能会导致缓冲区大小发生变化。

代码似乎假设播放回调缓冲区与输入回调缓冲区大小相同。这不能保证。因此,回放可能会以太少的样本结束,从而导致周期性故障。

【讨论】:

【参考方案2】:

根据我的经验(iPhone 6),未插入耳机时麦克风的采样率可以为 48000,插入耳机时更改为 44100。

如果您的音频单元预计采样率为 44100,那么会出现此类故障。为了验证,您可以尝试在插入耳机后问题是否仍然存在。

故障问题的解决方法似乎是使用 AVAudioEngine。使用 inputNode 的 inputFormat 将其 inputNode 连接到其 mainMixerNode。以您想要的格式将 mainMixerNode 连接到您的 AudioUnit。将您的 AudioUnit 连接到 AVAudioEngine 的 outputNode。

在此解决方法中,在 inputNode 和 audioUnit 之间使用此 mixerNode 是必不可少的。

【讨论】:

以上是关于AudioUnit 每 30 秒录制一次故障的主要内容,如果未能解决你的问题,请参考以下文章

本地通知每 30 秒重复一次

每 30 秒运行一次 cron 作业的最佳方式是啥? [复制]

如何使用带有 Xamarin 的 AudioUnit 录制音频

停止 AudioUnit 录制后出错

图像每 30 秒更换一次 - 循环

iOS 中 AudioUnit Graph 的可重用性