2016-12-13 66 views
0

我正在使用swift 3和xcode創建自定義攝像頭視圖。在自定義攝像頭切換攝像頭時平滑過渡swift + xcode

我已經得到它的工作,但我面臨一個小問題。要從前面/後面切換攝像頭設備,我停止會話,從視圖中刪除視頻預覽圖層,然後創建新會話並從前置攝像頭添加新的視頻預覽圖層。這使得新相機出現了一個混蛋。我想要在相機設備之間平滑過渡。我怎樣才能做到這一點?

這裏我加載攝像頭的代碼:當用戶點擊更改攝像機

@IBAction func changeCamera(_ sender: UIButton) { 

    if cameraPos == "back" 
    {cameraPos = "front"} 

    else 
    {cameraPos = "back"} 


    loadCamera() 
} 

回答

0

呼籲

func loadCamera() 
{ 

    session?.stopRunning() 
    videoPreviewLayer?.removeFromSuperlayer() 

    session = AVCaptureSession() 
    session!.sessionPreset = AVCaptureSessionPresetPhoto 


    var backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .front) 

    if cameraPos == "back" 
    { 
     backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back) 
    } 

    var error: NSError? 
    var input: AVCaptureDeviceInput! 
    do { 
     input = try AVCaptureDeviceInput(device: backCamera) 
    } catch let error1 as NSError { 
     error = error1 
     input = nil 
     print(error!.localizedDescription) 
    } 

    if error == nil && session!.canAddInput(input) { 
     session!.addInput(input) 

     stillImageOutput = AVCapturePhotoOutput() 


     if session!.canAddOutput(stillImageOutput) { 
      session!.addOutput(stillImageOutput) 


      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) 

      videoPreviewLayer?.frame = cameraView.bounds 
      videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
      videoPreviewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait 


      cameraView.layer.addSublayer(videoPreviewLayer!) 
      session!.startRunning() 

     } 
    } 
} 

我把這種從viewWillAppear中

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    loadCamera() 
} 

和我打電話負荷相機函數裏面viewDidAppear而不是viewWillAppear

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    loadCamera() 
} 

後臺線程:

DispatchQueue.global(qos: .background).async { 

    // perform ui updation and web related code 
    // background thread 

    DispatchQueue.main.async { 
     // main thread 
    } 
} 
+0

嘗試。仍然是相同的 – user2238284

+0

您可以使用後臺線程也執行一些uicomponents更新。 – vaibhav

+0

任何建議或鏈接,你可以分享我可以看看? – user2238284