You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Xcode模拟器中AVAudioEngine无麦克风输入,iPhone 5代码可正常读取

解决AVAudioEngine在Xcode模拟器无法获取麦克风输入的问题

嘿,这个问题我之前调试音频功能时也踩过坑!真机正常但模拟器不行,主要是模拟器的环境限制、权限配置和格式兼容性问题导致的,给你几个排查和解决的方向:

1. 先确认麦克风权限配置

模拟器同样需要获取麦克风权限,很多时候是Info.plist里的权限声明缺失导致的:

  • 打开项目的Info.plist,添加NSMicrophoneUsageDescription键,值填一段权限说明(比如"需要访问麦克风进行音频录制")
  • 运行模拟器后,去系统设置里确认App已经获得麦克风权限(路径:设置 > 你的App > 麦克风)

2. 适配模拟器的音频格式逻辑

模拟器的AVAudioEngine inputNode在格式兼容性上和真机有差异,你可以调整代码里的格式处理:

  • 优先使用inputNode原生的输入格式来连接节点和设置tap,避免强制自定义格式导致不兼容:
let input = audioEngine.inputNode 
let mixer = AVAudioMixerNode() 
audioEngine.attach(mixer) 

// 直接复用inputNode的原生格式
let inputFormat = input.inputFormat(forBus: 0)
audioEngine.connect(input, to: mixer, format: inputFormat) 

// tap也使用相同格式
mixer.installTap(onBus: 0, bufferSize: 2048, format: inputFormat) { (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in
    // 你的音频处理逻辑
}
  • 如果必须使用自定义的pcmFormatFloat32格式,先检查inputNode是否支持该格式再继续:
guard let targetFormat = AVAudioFormat(commonFormat: AVAudioCommonFormat.pcmFormatFloat32, sampleRate: SAMPLE_RATE, channels: 1, interleaved: false),
      input.inputFormat(forBus: 0).isCompatible(with: targetFormat) else {
    print("当前模拟器不支持该音频格式")
    return
}
// 后续用targetFormat进行连接和tap设置

3. 检查模拟器的系统麦克风状态

  • 打开Mac的系统偏好设置 > 声音 > 输入,确认当前选中的麦克风是可用的(比如内置麦克风),且没有被其他应用占用
  • 重启模拟器,有时候模拟器的音频服务会出现异常,重启后能恢复正常

另外补充个小细节:部分旧iOS版本的模拟器存在AVAudioEngine的已知bug,如果上述方法都不行,可以尝试切换不同iOS版本的模拟器测试,或者更新Xcode到最新版本。

内容的提问来源于stack exchange,提问作者Simon Hessner

火山引擎 最新活动