首页 > 解决方案 > 如何将多个音频 AVCaptureDevice 添加到 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 添加到相同的连接输入数组中。

标签: swiftavfoundationavcapturesession

解决方案


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

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

https://stackoverflow.com/a/30191013/22147

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

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

您可以在以下位置手动创建聚合音频设备Audio MIDI Setup.apphttps ://stackoverflow.com/a/65704755/22147

或以编程方式,使用AudioHardwareCreateAggregateDevice()https ://stackoverflow.com/a/56415699/22147 如果您使用编程路线,您可以通过设置kAudioAggregateDeviceIsPrivateKey来隐藏生成的聚合设备true。您可能希望这样做以阻止用户弄乱它。


推荐阅读