2016-12-13 17 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() 
} 

からこれを呼び出すと、私はロードカメラを呼び出しを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

関連する問題