如何将多个音频 AVCaptureDevice 添加到 AVCaptureSession
Posted
技术标签:
【中文标题】如何将多个音频 AVCaptureDevice 添加到 AVCaptureSession【英文标题】:How to add multiple audio AVCaptureDevice to an AVCaptureSession 【发布时间】:2021-11-14 19:03:25 【问题描述】:我正在尝试将多个音频 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 都会被添加到同一个连接输入数组中。
【问题讨论】:
【参考方案1】:我认为不支持多个音频和视频AVCaptureInput
s,但我也找不到任何文档。
不久前,这个人巧妙地使用addOutputWithNoConnections()
创建了多个视频 输入和输出,然后手动创建到输入的连接(但为什么没有addInputWithNoConnections()
?):
https://***.com/a/30191013/22147
这可能值得尝试使用音频!如果您尝试这样做,请报告您的结果!
但是我喜欢将输入设备包装在一个聚合音频设备中,然后配置 AVCaptureSession
以使用它。这使您可以方便地使用单个“设备”,并且您不必担心多个时钟和时间戳,因为两个设备都是同步的。
您可以在Audio MIDI Setup.app
:https://***.com/a/65704755/22147中手动创建聚合音频设备
或以编程方式,使用AudioHardwareCreateAggregateDevice()
:
https://***.com/a/56415699/22147
如果您使用程序化路由,您可以通过将kAudioAggregateDeviceIsPrivateKey
设置为true
来隐藏生成的聚合设备。您可能希望这样做以阻止用户使用它。
【讨论】:
感谢您的精彩回复。有趣的是,我今天早上刚刚偶然发现了视频输入解决方案,所以不妨试一试,看看它是否有效。也就是说,我真的很喜欢创建聚合设备的想法,因为它可能会提供更多的控制权。我会回来报告的。以上是关于如何将多个音频 AVCaptureDevice 添加到 AVCaptureSession的主要内容,如果未能解决你的问题,请参考以下文章