macOS:作为 AVFoundation CaptureDevice 访问虚拟相机 (OBS)

问题描述

在 macOS 上,是否可以将虚拟相机(例如 OBS)视为 CaptureDevice? 我看到,例如 Google Chrome 或 Zoom 可以使用此相机,但使用 AVCaptureDevice.discoverySession 我看不到它。

我做错了吗?

    var deviceTypes: [AVCaptureDevice.DeviceType] = [.builtInMicrophone,.builtInWideAngleCamera]
    #if os(OSX)
    deviceTypes.append(.externalUnkNown)
    #else
    deviceTypes.append(contentsOf: [.builtInDualCamera,.builtInDualWideCamera,.builtInTelephotoCamera,.builtInTripleCamera,.builtInTrueDepthCamera,.builtInUltraWideCamera])
    #endif
    let discoverySession = AVCaptureDevice.discoverySession(deviceTypes: deviceTypes,mediaType: nil,position: .unspecified)

    result = discoverySession.devices.map { device in
        device.localizedname
    }

解决方法

这可能与强化运行时和库验证有关。

当库验证打开时,macOS 不再加载使用 3rd 方凭据签名的框架或插件。这是 Hardened Runtime 的一部分,现在默认启用。不知道 OBS,但虚拟捕获设备通常实现为 CoreMediaIO 插件,在应用启动时加载,因此受此影响。

为了快速测试,您可以尝试禁用强化运行时或在 HR 开启的情况下设置 entitlement that disables library validation。我不知道 Mac App Store 是否接受具有此权利的应用程序。
另一种方法是使用您的签名凭据重新签名 CoreMediaIO 插件(如果可能/允许):https://developer.apple.com/forums/thread/126895?answerId=398061022#398061022

developers of Camoa good FAQ with some technical details 关于库验证对 CoreMediaIO 插件的影响,还有一个全面的 StackOverflow 答案 here

,

尝试将 DiscoverSession mediaType 设置为 .video,并确保您的 OBS 虚拟摄像头正常工作:您应该能够在 Photo Booth.app 的“摄像头”菜单中选择它.