【问题标题】:How to get iPhone as AVCaptureDevice on macOS?如何在 macOS 上将 iPhone 作为 AVCaptureDevice?
【发布时间】:2019-12-16 04:16:49
【问题描述】:

我已经实现了下面链接的帖子中的代码。但是它没有更新以说明 AVCaptureDevice.devices() 现在已被弃用。

iOS Device not listed by AVCaptureDevice.devices() unless Quicktime is opened

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

谢谢!

【问题讨论】:

  • 我看到我的帖子被降级了。如果有人能指出我为最新版本的 Swift 创建 macOS 应用程序解决此问题的正确位置,我将很乐意删除它。谢谢!

标签: swift iphone macos avcapturedevice core-media


【解决方案1】:

好的,所以在结合了其他一些 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
    }
}

【讨论】:

  • 谢谢@joeshonm——这很好用! ? 但是我注意到在这种情况下检测到的AVCaptureDevice 参数formats 是空的,因此我无法确定我的视图的纵横比或合适的尺寸。有什么提示吗?
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 2022-08-22
  • 1970-01-01
  • 2021-11-18
  • 2020-09-12
  • 2020-05-29
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多