如何将多个音频 AVCaptureDevice 添加到 AVCaptureSession

How to add multiple audio AVCaptureDevice to an AVCaptureSession

我正在尝试将多个音频 AVCaptureDeviceInputs 添加到 AVCaptureSession (macOS)。

我的理解是 AVCaptureConnections 是在兼容的输入和输出之间自动创建的。

我可以成功添加单个相机和音频设备,绝对没问题。添加第二个音频设备时出现问题。我想叠加来自多个来源的音频。

音频输入添加如下:

for device in newDevices {
   do {
      let newAudioDeviceInput = try AVCaptureDeviceInput(device: device)
      if self.captureSession.canAddInput(newAudioDeviceInput) {
         self.captureSession.addInput(newAudioDeviceInput)
         self.audioDeviceInputs.append(newAudioDeviceInput)
      }
   } catch {
      errors.append(error)
   }
}

print(captureSession.inputs.count) 成功显示正确的输入数

输出添加如下:

let audioDataOutput = AVCaptureAudioDataOutput()
audioDataOutput.setSampleBufferDelegate(delegate, queue: queue)
if self.captureSession.canAddOutput(audioDataOutput) {
   self.captureSession.addOutput(audioDataOutput)
   self.audioDataOutput = audioDataOutput
} else {
   throw Error.cannotAddOutput
}

在添加的第一个输入和输出之间创建单个 AVCaptureConnection,但没有后续输入添加到连接。

我真的很难找到任何合适的文档,所以非常感谢任何建议。我的期望是每个额外的 AVCaptureDeviceInput 都会被添加到同一个连接输入数组中。

认为 多个音频和视频 AVCaptureInput 不受支持,但我也找不到任何相关文档。

不久前,这个人巧妙地通过使用 addOutputWithNoConnections() 创建了多个 video 输入和输出,然后手动创建到输入的连接(但为什么没有 addInputWithNoConnections()?):

这可能值得尝试使用音频!如果您尝试此操作,请报告您的结果!

不过我喜欢将输入设备封装在聚合音频设备中,然后配置 AVCaptureSession 来使用它。这为您提供了使用单个“设备”的便利,并且您不必担心多个时钟和时间戳,因为两个设备都是同步的。

您可以在Audio MIDI Setup.app中手动创建聚合音频设备:

或以编程方式,使用 AudioHardwareCreateAggregateDevice(): 如果您使用程序化路由,您可以通过将 kAudioAggregateDeviceIsPrivateKey 设置为 true 来隐藏生成的聚合设备。您可能希望这样做以阻止用户乱用它。