macOS下如何为AVCaptureSession添加多个音频AVCaptureDeviceInput?
解决方案
1. 禁用自动连接配置
AVCaptureSession 默认的自动连接逻辑只会为第一个音频输入和音频输出创建连接,不会自动将后续新增的音频输入加入已有连接。你需要在添加输入、输出设备前,先关闭会话的自动连接配置开关:
captureSession.automaticallyConfiguresConnections = false
2. 统一音频设备参数
多音频输入共用同一连接时,要求所有音频设备的采样率、声道数、位深度等格式参数完全一致,否则连接会创建失败。可以在添加设备前主动配置所有音频设备的格式:
for device in newDevices { try device.lockForConfiguration() // 统一配置为44.1kHz 双声道 16位整型,可根据需求调整 if let format = device.formats.first(where: { $0.formatDescription.audioStreamBasicDescription?.mSampleRate == 44100 && $0.formatDescription.audioStreamBasicDescription?.mChannelsPerFrame == 2 }) { device.activeFormat = format } device.unlockForConfiguration() }
3. 手动创建包含所有音频输入的连接
所有音频输入添加完成后,收集所有音频输入的端口,手动创建关联所有端口和音频输出的连接,添加到会话中:
// 收集所有音频输入的音频端口 var allAudioPorts = [AVCaptureInput.Port]() for input in audioDeviceInputs { let ports = input.ports(for: .audio, sourceDeviceType: nil, sourceDevicePosition: .unspecified) allAudioPorts.append(contentsOf: ports) } // 创建多输入连接 let audioConnection = AVCaptureConnection(inputPorts: allAudioPorts, output: audioDataOutput) if captureSession.canAddConnection(audioConnection) { captureSession.addConnection(audioConnection) } else { throw Error.cannotAddConnection }
4. 音频混合处理
如果你需要最终输出混合后的单路音频流,可以在AVCaptureAudioDataOutput的代理回调中,对各路音频的样本缓冲区进行时间对齐后,使用AVAudioEngine、AVAudioMixerNode或者直接操作PCM数据完成混合。
注意事项
- 多音频输入合并为单个连接的能力仅macOS平台支持,iOS/iPadOS不支持该特性
- 建议开启会话的主时钟同步所有设备时间,避免不同音频设备时钟偏移导致的音频卡顿、不同步问题:
captureSession.usesApplicationAudioSession = true if let masterClock = captureSession.masterClock { audioDataOutput.setSampleBufferDelegate(delegate, queue: queue, clock: masterClock) }
- 需要确保你已经获取了所有待添加音频设备的捕获权限,权限缺失会导致输入添加失败。
内容的提问来源于stack exchange,提问作者DanM
相关产品推荐
相关产品推荐

