AudioUnit每隔30秒录制一次故障

问题描述 投票:0回答:2

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

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

  • 请指出一些不同的示例代码或建议我需要添加的内容(高级建议很好 - 我很乐意研究和完成工作,我只是不自信工作是什么)
  • 建议一些更好的值用于缓冲区数据大小。
  • 告诉我这个代码没什么问题,我的bug几乎肯定在其他地方。
  • 建议我可以使用的图书馆应该照顾它(神奇的音频引擎2看起来对我很好,但我有点担心它已退休的说明.AudioKit看起来也很棒,但它缺少峰值功率读数,这将是导入这样一个复杂的库之后必须实现自己的耻辱)

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

ios objective-c iphone avaudiosession audiounit
2个回答
1
投票

几个问题。

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

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

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.