AudioUnit每隔30秒录制一次故障

时间:2017-08-16 14:20:11

标签: ios objective-c iphone avaudiosession audiounit

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

我发现每30秒就会出现一些问题。虽然我可能错了,但它们听起来有点像缓冲区故障。我试过联系文章的作者但没有取得多大成功。我真的很难遵循这些代码。我认为它缺少一个循环缓冲区,但我不确定它在这里有多重要。我希望有人能指出我正确的方向:

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

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

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

  • 建议我可以使用的图书馆应该照顾它(Amazing Audio Engine 2看起来对我很好,但是我有点担心这条说它已经退役了.MadicKit看起来也很棒但它缺少一个峰值功率读数,在导入这样一个复杂的库之后必须实现自己是一种耻辱)

为什么我没有使用AVAudioSession?我需要用户能够在录制时设置麦克风级别并能够同时收听。以前我用AVAudioSession做过这个,但是在最近的设备上,isInputGainSettable返回NO。对于通过闪电线插入的许多硬件麦克风,它也会返回NO,我们现在越来越多地看到耳机插孔消失了。

2 个答案:

答案 0 :(得分:1)

几个问题。

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

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

代码似乎假设播放回调缓冲区与输入回调缓冲区的大小相同。这不保证。因此,播放可能会导致样本过少,导致周期性毛刺。

答案 1 :(得分:0)

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

如果您的audiounit预计采样率为44100,则会出现类似这样的故障。要验证,您可以尝试在插入耳机时问题仍然存在。

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

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