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/

相关文章:

ios - 如何根据键盘高度快速更新 y 的文本输入位置

android - BLE设备读取特征值的Arraybuffer如何取值

javascript - Cookies 在使用 PHONEGAP 的 IPhone IOS 和 ANDROID 上工作吗?

iphone - 如何解决这个问题签名无效,或者不是用Apple提交证书签名的。 (-19011)

objective-c - Swift 相当于 id<MyProtocol>?

ios - 动画约束时高度 anchor 的自动布局错误

ios - 透明背景变白

ios - UIButton高亮显示的图像未显示

iphone - 我们如何通过我们的服务器只为我们的客户发布我们的 ios 应用程序?

ios - 在 Firebase 中使用事务