2017-08-16 166 views
0

我已經使用此示例代碼來創建錄音機。 http://www.stefanpopp.de/capture-iphone-microphone/AudioUnit每30秒錄製一次毛刺

我發現我每隔30秒就會發生一次小故障。他們聽起來有點像緩衝區,但我可能是錯的。我試過聯繫這篇文章的作者,但沒有取得太大的成功。我非常努力地遵循這些代碼。我認爲它缺少一個循環緩衝區,但我不確定這裏有多重要。我希望有人能夠要麼點我在正確的方向:

  • 點我一些不同的示例代碼或暗示什麼,我需要添加到這個(高層次的建議是好的 - 我很高興研究和做的工作,我只是不確定工作是什麼)

  • 建議一些更好的值用於像緩衝區數據大小的東西。

  • 告訴我,這段代碼沒有錯,我的錯誤幾乎肯定是在其他地方。

  • 推薦圖書館我可以使用它應該照顧它(驚人的音頻引擎2看起來不錯,但我有點擔心這個音符說已經退役AudioKit看起來不錯,但它缺少峯值功率閱讀,這將是一個恥辱,必須在導入這樣一個複雜的圖書館後實施自己)

爲什麼我不使用AVAudioSession?我需要用戶能夠在錄音時設置話筒電平,並且能夠同時收聽。以前我用AVAudioSession做過這個,但是在最近的設備上isInputGainSettable返回NO。對於通過閃電電纜插入的許多硬件話筒,它也會返回NO,我們現在看到越來越多的耳機插孔消失了。

回答

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在此解決方案中非常重要。