swift - 如何将多个音频 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 添加到相同的连接输入数组中。
解决方案
我认为不支持多个音频和视频AVCaptureInput
,但我也找不到任何文档。
不久前,这个人巧妙地通过使用创建了多个视频输入和输出addOutputWithNoConnections()
,然后手动创建了与输入的连接(但为什么不addInputWithNoConnections()
呢?):
https://stackoverflow.com/a/30191013/22147
这可能值得尝试音频!如果您尝试此操作,请报告您的结果!
但是我喜欢将输入设备包装在一个聚合音频设备中,然后配置它AVCaptureSession
来使用它。这为您提供了使用单个“设备”的便利,并且您不必担心多个时钟和时间戳,因为两个设备都是同步的。
您可以在以下位置手动创建聚合音频设备Audio MIDI Setup.app
:https ://stackoverflow.com/a/65704755/22147
或以编程方式,使用AudioHardwareCreateAggregateDevice()
:
https ://stackoverflow.com/a/56415699/22147
如果您使用编程路线,您可以通过设置kAudioAggregateDeviceIsPrivateKey
来隐藏生成的聚合设备true
。您可能希望这样做以阻止用户弄乱它。
推荐阅读
- linux - hive log4j + 为什么在 /var/log/hive 下创建的日志不像 log4j 中定义的那样
- regex - 正则表达式匹配双引号括起来的值
- excel - 获取每月月底的库存余额
- dji-sdk - OnboardSDK:任务管理和 HomePoint 初始化
- android - 在 Play 商店中上传两个具有相同包和应用名称的 Apk
- ios - 从表视图中删除行
- python - 从显示错误的烧瓶表单数据中获取 sys.argv[] 值
- xamarin - How to hide status bar of splash screen in xamarin forms
- sql-server - IIS 错误'找不到存储过程'MyProcedure'
- php - php mongodb中的数组投影