2017-01-05 39 views
1

Swift3 iOS10應用程序。我把一個SCNView放在故事板框架中。我把一個UIView放在(帶到前面)的頂部,並將其尺寸調整爲僅填充屏幕中心的一部分。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是「外部視圖」的對等體,一個Xcode會自動插入。是的,這是在我的手機上運行...添加捕捉。而且,所有的if都可以,並且沒有錯誤被拋出。 –

回答

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) 

運行起來!