如何在 macOS 上将 iPhone 设为 AVCaptureDevice?

joe*_*onm 2 iphone macos core-media avcapturedevice swift

我已经实现了下面链接的帖子中的代码。但是,由于 AVCaptureDevice.devices() 现已弃用,因此它不会更新。

除非打开 Quicktime,否则 AVCaptureDevice.devices() 不会列出 iOS 设备

有人有这个的最新实施吗?

谢谢你!

joe*_*onm 5

好的,在结合了其他一些 Stack Overflow 答案后,我能够让它与 AVCaptureDevice.DiscoverySession 的最新实现一起使用。

诀窍是在启用屏幕捕获设备后调用 DiscoverSession 来获取设备。然后添加观察者来寻找新连接的设备,它就会显示出来。

前面的答案都使用了旧的 AVCaptureDevice.devices() 方法。我下面的示例使用更新的方法。

import Cocoa
import Foundation
import AVKit
import CoreMediaIO

class PlayerNSView: NSView{
    private let playerLayer = AVPlayerLayer()
    private let nc = NotificationCenter.default

    override init(frame:CGRect){
        super.init(frame: frame)


        let urlVideo = URL(string: "https://www.radiantmediaplayer.com/media/bbb-360p.mp4")!
        let player = AVPlayer(url: urlVideo)
        //player.play()
        playerLayer.player = player
        if layer == nil{
            layer = CALayer()
        }
        layer?.addSublayer(playerLayer)

        self.enableDalDevices()

        let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.externalUnknown], mediaType: nil, position: .unspecified)



        nc.addObserver(self, selector: #selector(newDevice), name: NSNotification.Name.AVCaptureDeviceWasConnected, object: nil)

    }

    @objc func newDevice() {
        let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.externalUnknown], mediaType: nil, position: .unspecified)
        print("Devices: \(discoverySession.devices)")
    }



    public func enableDalDevices() {


        var property = CMIOObjectPropertyAddress(mSelector: CMIOObjectPropertySelector(kCMIOHardwarePropertyAllowScreenCaptureDevices), mScope: CMIOObjectPropertyScope(kCMIOObjectPropertyScopeGlobal), mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMaster))
        var allow : UInt32 = 1
        let sizeOfAllow = MemoryLayout.size(ofValue: allow)
        CMIOObjectSetPropertyData(CMIOObjectID(kCMIOObjectSystemObject), &property, 0, nil, UInt32(sizeOfAllow), &allow)

    }


    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func layout() {
        super.layout()

        playerLayer.backgroundColor = .black
        playerLayer.frame = bounds
    }
}
Run Code Online (Sandbox Code Playgroud)