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

Posted

技术标签:

【中文标题】将 ARSCNView 场景背景内容设置为 iPhone X 摄像头【英文标题】:Setting ARSCNView scene background contents to iPhone X camera 【发布时间】:2018-08-29 22:16:29 【问题描述】:

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

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

视频和面部跟踪都冻结 面部跟踪有效,但视频冻结 视频有效,但面部跟踪冻结 几个视频帧和/或面罩帧在冻结之前

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!)
  

【问题讨论】:

【参考方案1】:

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

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

注意:媒体捕捉不支持同时捕捉 iOS 设备上的前置和后置摄像头。

【讨论】:

以上是关于将 ARSCNView 场景背景内容设置为 iPhone X 摄像头的主要内容,如果未能解决你的问题,请参考以下文章

ARKit从入门到精通-ARScnView介绍

无论相机的位置如何,在 ARSCNVIEW 中绘制一个 SCNNode

使用子视图拍摄 ARSCNView 快照

CAGradientLayer 设置为场景包背景块场景

将 12 个 ARFrame 添加到 Array (iOS/Swift) 后 ARSCNView 冻结

Libgdx |场景2d |设置表格的背景颜色?