我已经使用这个示例代码来创建录音机。 http://www.stefanpopp.de/capture-iphone-microphone/
我发现每30秒就会出现一些问题。虽然我可能错了,但它们听起来有点像缓冲区故障。我试过联系文章的作者,但没有取得多大成功。我真的很难遵循这些代码。我认为它缺少一个循环缓冲区,但我不确定它在这里有多重要。我希望有人能指出我正确的方向:
为什么我不使用AVAudioSession?我需要用户能够在录制时设置麦克风级别并能够同时收听。以前我用AVAudioSession做过这个,但是在最近的设备上,isInputGainSettable返回NO。对于通过闪电线插入的许多硬件麦克风,它也会返回NO,我们现在越来越多地看到耳机插孔消失了。
几个问题。
Apple建议不要在音频上下文中调用对象方法(回调)。你的代码有几个。请改用C函数。
较新的iOS设备可能使用48000的硬件采样率,而不是44100.重采样可能会导致缓冲区更改大小。
代码似乎假设播放回调缓冲区与输入回调缓冲区的大小相同。这不保证。因此,播放可能会因样本太少而导致周期性毛刺。
根据我的经验(iPhone 6),未插入耳机时麦克风的采样率可达48000,插入耳机时可更改为44100。
如果您的audiounit期望采样率为44100,则会出现类似这样的故障。要验证,您可以尝试在插入耳机时问题仍然存在。
毛刺问题的解决方法似乎是使用AVAudioEngine。使用inputNode的inputFormat将其inputNode连接到其mainMixerNode。以您想要的格式将mainMixerNode连接到AudioUnit。将AudioUnit连接到AVAudioEngine的outputNode。
在此解决方法中,在inputNode和audioUnit之间使用此mixerNode是必不可少的。