MacOS下AudioKit麦克风输入异常:PitchTap无法采集音频数据
解决AudioKit中PitchTap无法获取麦克风采样数据的问题
我用AudioKit搭建了AudioEngine,MIDISampler可以正常播放音符,但PitchTap连接麦克风时无法获取有效采样数据,始终输出Frequency 100.0 – Amplitude 2.4266092e-05,将PitchTap连接到sampler则能正常工作。相关代码如下:
final class AudioGraph { let engine = AudioEngine() let sampler = MIDISampler(name: "sampler") let pitchTracker: PitchTap init(file: SamplerFile? = nil) throws { let mic = engine.input! engine.output = Mixer( sampler, Fader(mic, gain: 0.000) ) /// Hooking ``PitchTap`` to ``sampler`` works. Yay. Why not the ``mic`` input? pitchTracker = PitchTap(mic) { f, a in guard let f = f.first, let a = a.first else { return } print("Frequency \(f) – Amplitude \(a)") } if let file { try setFile(file) } } func setFile(_ file: SamplerFile) throws { try sampler.loadInstrument(url: file.url) } } // MARK: - extension AudioGraph: NotePlayer { func startAudioEngine() throws { print("### Start engine") try engine.start() pitchTracker.start() } }
问题原因分析
- 麦克风信号被完全静音:代码中给麦克风添加的
Fader增益设为0.000,导致麦克风输入信号被彻底消除,PitchTap自然采集不到有效数据。 - 权限缺失:iOS/macOS平台下,应用访问麦克风需要提前申请权限,若未配置权限,麦克风输入会被系统拦截。
- 输入路由问题:强制解包
engine.input!可能忽略了麦克风不可用的情况,且启动顺序可能导致麦克风输入未被正确激活。
解决方案
1. 修复麦克风增益设置
如果不需要麦克风声音输出到扬声器,可将麦克风单独给PitchTap处理,不混入主输出:
init(file: SamplerFile? = nil) throws { guard let mic = engine.input else { throw NSError(domain: "AudioGraph", code: -1, userInfo: [NSLocalizedDescriptionKey: "麦克风输入不可用"]) } // 主输出仅保留sampler的声音 engine.output = sampler pitchTracker = PitchTap(mic) { f, a in guard let f = f.first, let a = a.first else { return } print("Frequency \(f) – Amplitude \(a)") } if let file { try setFile(file) } }
若需要麦克风声音输出,将Fader增益调整为合理值(如1.0)即可。
2. 配置麦克风权限
在Info.plist中添加权限描述:
- iOS:添加
NSMicrophoneUsageDescription,值为申请麦克风权限的说明文本(如"需要访问麦克风以采集音频") - macOS:添加
NSMicrophoneUsageDescription,同样填写权限说明
3. 优化启动逻辑
确保麦克风输入已激活后再启动PitchTap:
func startAudioEngine() throws { print("### Start engine") try engine.start() guard let mic = engine.input else { return } mic.isEnabled = true pitchTracker.start() }
内容的提问来源于stack exchange,提问作者Benjohn
相关产品推荐
相关产品推荐

