2016-12-13 1 views
0

신속한 3 및 xcode를 사용하여 사용자 정의 카메라보기를 만들었습니다.사용자 정의 카메라에서 카메라를 전환하는 동안 부드러운 전환 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() 
} 

에서이 전화를하고 난 부하 카메라를 호출을 loadCamera() 내부에 viewDidAppear 대신의 기능이 있습니다.

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