我已使用此示例代码创建录音机。 http://www.stefanpopp.de/capture-iphone-microphone/
我发现每30秒就会出现一些问题。虽然我可能错了,但它们听起来有点像缓冲区故障。我试过联系文章的作者但没有取得多大成功。我真的很难遵循这些代码。我认为它缺少一个循环缓冲区,但我不确定它在这里有多重要。我希望有人能指出我正确的方向:
请指出一些不同的示例代码或建议我需要添加的内容(高级别的建议很好 - 我很乐意研究和完成工作,我只是不自信工作是什么)
建议一些更好的值用于缓冲区数据大小。
告诉我这段代码没有任何问题,我的错误几乎可以肯定在其他地方。
建议我可以使用的图书馆应该照顾它(Amazing Audio Engine 2看起来对我很好,但是我有点担心这条说它已经退役了.MadicKit看起来也很棒但它缺少一个峰值功率读数,在导入这样一个复杂的库之后必须实现自己是一种耻辱)
为什么我没有使用AVAudioSession?我需要用户能够在录制时设置麦克风级别并能够同时收听。以前我用AVAudioSession做过这个,但是在最近的设备上,isInputGainSettable返回NO。对于通过闪电线插入的许多硬件麦克风,它也会返回NO,我们现在越来越多地看到耳机插孔消失了。
答案 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是必不可少的。