2017-01-05 4 views
1

Swift3 iOS10アプリ。私はSCNViewをストーリーボードフレームに入れました。私はUIViewを(Bring to Front)の上に置き、スクリーンの中央部分だけを塗りつぶすようにサイズを決めました。AVFoundationプレビューが表示されない

私のviewDidLoad私はAVFoundationを使ってカメラを見つけ、セッションを構築し、入力を追加してプレビューを行い、そのプレビューをUIViewのレイヤーに追加します。

そして、私が代わりにプレビューの白い四角形を取得します:

enter image description here

私はどこかのステップを見逃していると仮定し...

// 3D scene and vars 
@IBOutlet var sceneView: SCNView! 
var camera: SCNNode! 
var sphere: SCNNode! 

// camera scene and vars 
@IBOutlet var cameraView: UIView! 
var cameraSession: AVCaptureSession = AVCaptureSession() 
var cameraDevice : AVCaptureDevice! 
var cameraInput : AVCaptureDeviceInput! 
var cameraLayer: AVCaptureVideoPreviewLayer! 

override func viewDidLoad() { 
    ... 3D setup here ... 

    cameraDevice = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back) 
    do { 
     let possibleCameraInput: AnyObject? = try AVCaptureDeviceInput(device: cameraDevice) 
     if let anInput = possibleCameraInput as? AVCaptureDeviceInput { 
      if cameraSession.canAddInput(anInput) { 
       cameraSession.addInput(anInput) 
      } 
     } 
    } catch _ { 
     //TODO handle this error 
    } 
    // add the preview layer to our imageview 
    if cameraSession.inputs.count > 0 { 
     cameraLayer = AVCaptureVideoPreviewLayer(session: cameraSession) as AVCaptureVideoPreviewLayer 
     cameraView.layer.addSublayer(cameraLayer) 
    } 
    cameraSession.startRunning() 
+0

これまでSCNViewの中から試したことはありませんでしたが、あなたのやり方は大丈夫です。あなたの問題のIDを持つことが、TODOのキャッチエラーを最初に埋め込むことを提案している場合。あなたのifステートメントを取得し、実際に入力を取得し、あなたのビューとレイヤーにサイズ(チェック制約など)があることを確認し、ビューを検査してください。シミュレータでこれを試していないのですか? – Scriptable

+0

SCNViewとUIViewは "外部ビュー"のピアであり、1つのXcodeが自動的に挿入されます。はい、これは私の電話で実行されています...スナップを追加します。また、すべてのifはOKで、エラーはスローされません。 –

答えて

0

OKもこれがあることが判明しましたちょっとした欠けているステップ。 ...あなたはに手動で設定さmasksToBounds、videoGravityを持っており、フレームまたは何も(バグ?悪いAPI?)たまたま

 let viewLayer = cameraView.layer 
     viewLayer.masksToBounds = true 
     cameraView.backgroundColor = UIColor.clear 
     cameraLayer = AVCaptureVideoPreviewLayer(session: cameraSession) as AVCaptureVideoPreviewLayer 
     cameraLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     cameraLayer.frame = cameraView.frame 
     cameraView.layer.addSublayer(cameraLayer) 

稼働して!

関連する問題