AVCaptureVideoPreviewLayer Delay when switching from Video & taking capturing image in still image mode












0















I Am using a library for creating custom camera on my swift app using the camera and video https://github.com/yonat/CameraBackground



But I am getting a delay & the camera will take an image using the flash when the flash setting is off
when switching my camera mode from video to still image and I'm trying to take an image after changing the outputs



unfortunately, if I don't set a delay it will return a dark image.



The code:



@IBAction func startCapture(_ sender: Any) {
DispatchQueue.background(delay: 0.1, background: {
// do something in background
let currentSession = self.previewLiveCamera.cameraLayer?.session
currentSession!.sessionPreset = AVCaptureSession.Preset.photo
currentSession!.addOutput(AVCaptureStillImageOutput())


}, completion: {
// when background job finishes, wait 3 seconds and do something in main thread

self.previewLiveCamera.takeCameraSnapshot( {
// animate snapshot capture
print("Starting...")
},
completion: { (capturedImage, error) -> () in
if capturedImage != nil {
print("compleated with image")
RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
nextViewController.image = capturedImage
nextViewController.transitioningDelegate = RZTransitionsManager.shared()
self.present(nextViewController, animated: true, completion: {
self.previewLiveCamera.removeCameraBackground()
self.addvideoCamBackground()
self.hideCaptureBtns()
self.progressView.popIn()
self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
})

}

})
})

}









share|improve this question



























    0















    I Am using a library for creating custom camera on my swift app using the camera and video https://github.com/yonat/CameraBackground



    But I am getting a delay & the camera will take an image using the flash when the flash setting is off
    when switching my camera mode from video to still image and I'm trying to take an image after changing the outputs



    unfortunately, if I don't set a delay it will return a dark image.



    The code:



    @IBAction func startCapture(_ sender: Any) {
    DispatchQueue.background(delay: 0.1, background: {
    // do something in background
    let currentSession = self.previewLiveCamera.cameraLayer?.session
    currentSession!.sessionPreset = AVCaptureSession.Preset.photo
    currentSession!.addOutput(AVCaptureStillImageOutput())


    }, completion: {
    // when background job finishes, wait 3 seconds and do something in main thread

    self.previewLiveCamera.takeCameraSnapshot( {
    // animate snapshot capture
    print("Starting...")
    },
    completion: { (capturedImage, error) -> () in
    if capturedImage != nil {
    print("compleated with image")
    RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
    nextViewController.image = capturedImage
    nextViewController.transitioningDelegate = RZTransitionsManager.shared()
    self.present(nextViewController, animated: true, completion: {
    self.previewLiveCamera.removeCameraBackground()
    self.addvideoCamBackground()
    self.hideCaptureBtns()
    self.progressView.popIn()
    self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
    })

    }

    })
    })

    }









    share|improve this question

























      0












      0








      0








      I Am using a library for creating custom camera on my swift app using the camera and video https://github.com/yonat/CameraBackground



      But I am getting a delay & the camera will take an image using the flash when the flash setting is off
      when switching my camera mode from video to still image and I'm trying to take an image after changing the outputs



      unfortunately, if I don't set a delay it will return a dark image.



      The code:



      @IBAction func startCapture(_ sender: Any) {
      DispatchQueue.background(delay: 0.1, background: {
      // do something in background
      let currentSession = self.previewLiveCamera.cameraLayer?.session
      currentSession!.sessionPreset = AVCaptureSession.Preset.photo
      currentSession!.addOutput(AVCaptureStillImageOutput())


      }, completion: {
      // when background job finishes, wait 3 seconds and do something in main thread

      self.previewLiveCamera.takeCameraSnapshot( {
      // animate snapshot capture
      print("Starting...")
      },
      completion: { (capturedImage, error) -> () in
      if capturedImage != nil {
      print("compleated with image")
      RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
      let storyboard = UIStoryboard(name: "Main", bundle: nil)
      let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
      nextViewController.image = capturedImage
      nextViewController.transitioningDelegate = RZTransitionsManager.shared()
      self.present(nextViewController, animated: true, completion: {
      self.previewLiveCamera.removeCameraBackground()
      self.addvideoCamBackground()
      self.hideCaptureBtns()
      self.progressView.popIn()
      self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
      })

      }

      })
      })

      }









      share|improve this question














      I Am using a library for creating custom camera on my swift app using the camera and video https://github.com/yonat/CameraBackground



      But I am getting a delay & the camera will take an image using the flash when the flash setting is off
      when switching my camera mode from video to still image and I'm trying to take an image after changing the outputs



      unfortunately, if I don't set a delay it will return a dark image.



      The code:



      @IBAction func startCapture(_ sender: Any) {
      DispatchQueue.background(delay: 0.1, background: {
      // do something in background
      let currentSession = self.previewLiveCamera.cameraLayer?.session
      currentSession!.sessionPreset = AVCaptureSession.Preset.photo
      currentSession!.addOutput(AVCaptureStillImageOutput())


      }, completion: {
      // when background job finishes, wait 3 seconds and do something in main thread

      self.previewLiveCamera.takeCameraSnapshot( {
      // animate snapshot capture
      print("Starting...")
      },
      completion: { (capturedImage, error) -> () in
      if capturedImage != nil {
      print("compleated with image")
      RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
      let storyboard = UIStoryboard(name: "Main", bundle: nil)
      let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
      nextViewController.image = capturedImage
      nextViewController.transitioningDelegate = RZTransitionsManager.shared()
      self.present(nextViewController, animated: true, completion: {
      self.previewLiveCamera.removeCameraBackground()
      self.addvideoCamBackground()
      self.hideCaptureBtns()
      self.progressView.popIn()
      self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
      })

      }

      })
      })

      }






      ios swift






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 22 '18 at 10:46









      sebastian misassebastian misas

      33




      33
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Usage from CameraBackground Readme:



          view.addCameraBackground()
          // ...
          view.takeCameraSnapshot( {
          // animate snapshot capture
          self.view.alpha = 0
          UIView.animate(withDuration: 1) { self.view.alpha = 1 }
          }, completion: { (capturedImage, error) -> () in
          self.view.freeCameraSnapshot() // unfreeze image
          // ... handle capturedImage and error
          })
          // ...
          view.removeCameraBackground()


          you can see, in usage is used this interval to set visibilty, so if you delete delay from your code, alpha stays 0. So use it how is described in GitHub with your code:



          view.addCameraBackground()

          view.takeCameraSnapshot( {
          print("Starting...")
          self.view.alpha = 0
          UIView.animate(withDuration: 1) { self.view.alpha = 1 }
          }, completion: { (capturedImage, error) -> () in
          self.view.freeCameraSnapshot()
          if capturedImage != nil {
          print("compleated with image")
          RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
          let storyboard = UIStoryboard(name: "Main", bundle: nil)
          let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
          nextViewController.image = capturedImage
          nextViewController.transitioningDelegate = RZTransitionsManager.shared()
          self.present(nextViewController, animated: true, completion: {
          self.previewLiveCamera.removeCameraBackground()
          self.addvideoCamBackground()
          self.hideCaptureBtns()
          self.progressView.popIn()
          self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
          })

          }
          })

          view.removeCameraBackground()





          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53429191%2favcapturevideopreviewlayer-delay-when-switching-from-video-taking-capturing-im%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            Usage from CameraBackground Readme:



            view.addCameraBackground()
            // ...
            view.takeCameraSnapshot( {
            // animate snapshot capture
            self.view.alpha = 0
            UIView.animate(withDuration: 1) { self.view.alpha = 1 }
            }, completion: { (capturedImage, error) -> () in
            self.view.freeCameraSnapshot() // unfreeze image
            // ... handle capturedImage and error
            })
            // ...
            view.removeCameraBackground()


            you can see, in usage is used this interval to set visibilty, so if you delete delay from your code, alpha stays 0. So use it how is described in GitHub with your code:



            view.addCameraBackground()

            view.takeCameraSnapshot( {
            print("Starting...")
            self.view.alpha = 0
            UIView.animate(withDuration: 1) { self.view.alpha = 1 }
            }, completion: { (capturedImage, error) -> () in
            self.view.freeCameraSnapshot()
            if capturedImage != nil {
            print("compleated with image")
            RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
            nextViewController.image = capturedImage
            nextViewController.transitioningDelegate = RZTransitionsManager.shared()
            self.present(nextViewController, animated: true, completion: {
            self.previewLiveCamera.removeCameraBackground()
            self.addvideoCamBackground()
            self.hideCaptureBtns()
            self.progressView.popIn()
            self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
            })

            }
            })

            view.removeCameraBackground()





            share|improve this answer






























              0














              Usage from CameraBackground Readme:



              view.addCameraBackground()
              // ...
              view.takeCameraSnapshot( {
              // animate snapshot capture
              self.view.alpha = 0
              UIView.animate(withDuration: 1) { self.view.alpha = 1 }
              }, completion: { (capturedImage, error) -> () in
              self.view.freeCameraSnapshot() // unfreeze image
              // ... handle capturedImage and error
              })
              // ...
              view.removeCameraBackground()


              you can see, in usage is used this interval to set visibilty, so if you delete delay from your code, alpha stays 0. So use it how is described in GitHub with your code:



              view.addCameraBackground()

              view.takeCameraSnapshot( {
              print("Starting...")
              self.view.alpha = 0
              UIView.animate(withDuration: 1) { self.view.alpha = 1 }
              }, completion: { (capturedImage, error) -> () in
              self.view.freeCameraSnapshot()
              if capturedImage != nil {
              print("compleated with image")
              RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
              let storyboard = UIStoryboard(name: "Main", bundle: nil)
              let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
              nextViewController.image = capturedImage
              nextViewController.transitioningDelegate = RZTransitionsManager.shared()
              self.present(nextViewController, animated: true, completion: {
              self.previewLiveCamera.removeCameraBackground()
              self.addvideoCamBackground()
              self.hideCaptureBtns()
              self.progressView.popIn()
              self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
              })

              }
              })

              view.removeCameraBackground()





              share|improve this answer




























                0












                0








                0







                Usage from CameraBackground Readme:



                view.addCameraBackground()
                // ...
                view.takeCameraSnapshot( {
                // animate snapshot capture
                self.view.alpha = 0
                UIView.animate(withDuration: 1) { self.view.alpha = 1 }
                }, completion: { (capturedImage, error) -> () in
                self.view.freeCameraSnapshot() // unfreeze image
                // ... handle capturedImage and error
                })
                // ...
                view.removeCameraBackground()


                you can see, in usage is used this interval to set visibilty, so if you delete delay from your code, alpha stays 0. So use it how is described in GitHub with your code:



                view.addCameraBackground()

                view.takeCameraSnapshot( {
                print("Starting...")
                self.view.alpha = 0
                UIView.animate(withDuration: 1) { self.view.alpha = 1 }
                }, completion: { (capturedImage, error) -> () in
                self.view.freeCameraSnapshot()
                if capturedImage != nil {
                print("compleated with image")
                RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
                nextViewController.image = capturedImage
                nextViewController.transitioningDelegate = RZTransitionsManager.shared()
                self.present(nextViewController, animated: true, completion: {
                self.previewLiveCamera.removeCameraBackground()
                self.addvideoCamBackground()
                self.hideCaptureBtns()
                self.progressView.popIn()
                self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
                })

                }
                })

                view.removeCameraBackground()





                share|improve this answer















                Usage from CameraBackground Readme:



                view.addCameraBackground()
                // ...
                view.takeCameraSnapshot( {
                // animate snapshot capture
                self.view.alpha = 0
                UIView.animate(withDuration: 1) { self.view.alpha = 1 }
                }, completion: { (capturedImage, error) -> () in
                self.view.freeCameraSnapshot() // unfreeze image
                // ... handle capturedImage and error
                })
                // ...
                view.removeCameraBackground()


                you can see, in usage is used this interval to set visibilty, so if you delete delay from your code, alpha stays 0. So use it how is described in GitHub with your code:



                view.addCameraBackground()

                view.takeCameraSnapshot( {
                print("Starting...")
                self.view.alpha = 0
                UIView.animate(withDuration: 1) { self.view.alpha = 1 }
                }, completion: { (capturedImage, error) -> () in
                self.view.freeCameraSnapshot()
                if capturedImage != nil {
                print("compleated with image")
                RZTransitionsManager.shared().defaultPresentDismissAnimationController = RZZoomAlphaAnimationController()
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                let nextViewController = storyboard.instantiateViewController(withIdentifier: "post") as! PostViewController
                nextViewController.image = capturedImage
                nextViewController.transitioningDelegate = RZTransitionsManager.shared()
                self.present(nextViewController, animated: true, completion: {
                self.previewLiveCamera.removeCameraBackground()
                self.addvideoCamBackground()
                self.hideCaptureBtns()
                self.progressView.popIn()
                self.progressView.transform = CGAffineTransform(rotationAngle: .pi)
                })

                }
                })

                view.removeCameraBackground()






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 22 '18 at 11:33

























                answered Nov 22 '18 at 11:14









                Robert DreslerRobert Dresler

                6,6592626




                6,6592626
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53429191%2favcapturevideopreviewlayer-delay-when-switching-from-video-taking-capturing-im%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

                    Does disintegrating a polymorphed enemy still kill it after the 2018 errata?

                    A Topological Invariant for $pi_3(U(n))$