ios - 将 ARSCNView 场景背景内容设置为 iPhone X 摄像头

原文 标签 ios iphone swift scenekit arkit

ARSCNView 自动将来自设备摄像头的实时视频源渲染为场景背景。但我正在尝试 手动 将场景背景内容设置为 iPhone X 相机之一。我可以成功地将 sceneView.scene.background.contents 设置为颜色、图像等,但不能设置为实时前置或后置摄像头。我尝试将 sceneView.scene.background.contents 设置为 AVCaptureDevice、AVCaptureDeviceInput 和 AVCaptureVideoPreviewLayer。我还在另一个 View 中尝试了独立的 AVCaptureVideoPreviewLayer。这些都不会导致同时进行摄像机视频和面部跟踪。

我觉得它可能与 ARFaceTrackingConfiguration() 自动使用前置摄像头有关,而无法同时显示单独的摄像头视频?我认为 iOS 11.2 修复了某种错误,但我在 11.3 上没有成功。根据我的方法,我得到以下之一:

  • 视频和面部跟踪卡住
  • 面部跟踪有效,但视频卡住
  • 视频有效,但面部跟踪卡住
  • 几个视频帧和/或 mask 帧卡住前


  • Swift4/iOS11/iPhone X

    直接设置scene.background.contents:
    @IBOutlet weak var sceneView: ARSCNView!
    
    override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
      sceneView.delegate = self
      sceneView.session.run(ARFaceTrackingConfiguration())
    
      // wait for scene and camera to activate
      DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
        let captureDevice = AVCaptureDevice.default(. builtInWideAngleCamera, for: .video, position: .front)!
        self.sceneView.scene.background.contents = captureDevice
      }
    }
    

    使用单独的视频层:
    @IBOutlet weak var sceneView: ARSCNView!
    var captureSession = AVCaptureSession()
    var inp: AVCaptureDeviceInput!
    var videoPreviewLayer: AVCaptureVideoPreviewLayer!
    
    override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
      sceneView.delegate = self
      sceneView.scene.background.contents = UIColor.yellow
      sceneView.session.run(ARFaceTrackingConfiguration())
    
      if let cam = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front) {
        do { inp = try AVCaptureDeviceInput(device: cam) }
        catch { fatalError("Failed to get device input") }
      } else { fatalError("Failed to get camera device") }
    
      captureSession.addInput(inp)
      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
      videoPreviewLayer?.frame = view.bounds
      videoPreviewLayer?.videoGravity = .resizeAspectFill
    
      DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
        self.captureSession.startRunning()
        self.view.layer.addSublayer(self.videoPreviewLayer!)
      }
    }
    

    最佳答案

    似乎您一次只能使用一台相机?

    https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW25

    Note: Media capture does not support simultaneous capture of both the front-facing and back-facing cameras on iOS devices.

    关于ios - 将 ARSCNView 场景背景内容设置为 iPhone X 摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49395408/

    相关文章:

    iphone - 根据 Tapku 日历高度设置 UITableView 框架

    iphone - objective-c :处理对从NSMutableArray中删除的对象的引用

    iphone - 如何找到一个月的特定日期?

    swift - 在框架模块 'SQLite.SQLite_Bridging' 中包含非模块化 header

    ios - 无法加载包 UITest,因为它已损坏或缺少必要的资源。尝试重新安装捆绑包

    ios - 使用 AVFoundation,如何从视频的所有帧中删除中间 400 像素

    ios - 创建小写搜索字符串swift的正确方法3

    ios - 摆脱旧模型版本中的核心数据警告

    ios - 带有Swift的Facebook SDK iOS-请求好友列表-方法说明

    swift - 我正在努力寻找一种将 IPO 股票从雅虎金融 API 中撤出的方法