如何将多个音频 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
来隐藏生成的聚合设备。您可能希望这样做以阻止用户乱用它。
我正在尝试将多个音频 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
来隐藏生成的聚合设备。您可能希望这样做以阻止用户乱用它。