AVAudioEngine修改inputNode的auAudioUnit设备后输出通道为0故障排查
问题根因
你遇到的所有异常都来自两个核心错误:
- AVAudioEngine的
inputNode和outputNode底层默认共享同一个Voice Processing I/O Audio Unit实例,这个AU同时负责音频输入采集和输出播放两个逻辑,所以你看到两者的auAudioUnit相等是系统的正常设计,不是异常。这个AU的输入端关联输入设备、输出端关联输出设备,你直接对整个AU调用setDeviceID,相当于把整个AU的绑定设备强制改成了输入麦克风设备,AU的输出端无法在麦克风设备上创建输出流,自然就返回了0Hz、0通道的无效格式。 - 你直接修改底层
auAudioUnit的属性属于未被苹果官方文档支持的操作,AVAudioEngine上层会缓存节点的格式、状态等参数,底层修改不会触发上层缓存更新,所以才会出现inputNode本身返回的格式和底层auAudioUnit返回格式不一致的问题。当你连接节点时,引擎用旧的缓存格式匹配底层已经失效的格式,就会触发崩溃。
正确修改输入设备的操作逻辑
不要直接操作auAudioUnit的setDeviceID方法,按照系统提供的标准接口修改即可:
- 先调用
avEngine.stop()停止当前运行的音频引擎 - 根据系统平台选择对应的设备切换接口:
- iOS/iPadOS平台:通过
AVAudioSession.sharedInstance()的setPreferredInput(_:)方法切换输入设备 - macOS平台:通过
AVAudioDevice的setDefault(_:for:)方法设置默认输入设备
- iOS/iPadOS平台:通过
- 重新调用
avEngine.prepare()、avEngine.start()启动引擎,引擎会自动重新初始化底层AU的参数,同步所有格式状态
内容的提问来源于stack exchange,提问作者msmialko
相关产品推荐
相关产品推荐

