【问题标题】:AudioUnit recording glitches every 30 secondsAudioUnit 每 30 秒录制一次故障
【发布时间】:2023-03-07 07:17:01
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: ios objective-c iphone avaudiosession audiounit


    【解决方案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 是必不可少的。

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 2012-06-13
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多