移动到背景和返回后,AVCaptureVideoPreviewLayer(相机预览)冻结/卡住

Roi*_*lia 18 camera preview ios avcapturesession avcapturedevice

无法想象这一个.当应用程序处于活动状态时,一切正常,有时当我将应用程序移动到后台(按下主页按钮)而不是返回时,预览层会冻结/卡住.我使用viewWillAppear和viewDidAppear进行设置.这是我如何设置一切:

  var backCamera = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
  var global_device : AVCaptureDevice!
  var captureSession: AVCaptureSession?

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)

captureSession = AVCaptureSession()
        captureSession!.sessionPreset = AVCaptureSessionPresetPhoto
        CorrectPosition = AVCaptureDevicePosition.Back
        for device in backCamera {
            if device.position == AVCaptureDevicePosition.Back {
                global_device = device as! AVCaptureDevice
                CorrectPosition = AVCaptureDevicePosition.Back
                break
            }
        }


        configureCamera()
        var error: NSError?
        var input = AVCaptureDeviceInput(device: global_device, error: &error)


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

            stillImageOutput = AVCaptureStillImageOutput()
            stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
            if captureSession!.canAddOutput(stillImageOutput) {
                captureSession!.addOutput(stillImageOutput)

                previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                var bounds:CGRect = camera_Preview.layer.bounds
                previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
                previewLayer?.bounds = bounds
                previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
                camera_Preview.layer.addSublayer(previewLayer)
                self.view.bringSubviewToFront(camera_Preview)
                self.view.bringSubviewToFront(nan_view)

                captureSession!.startRunning()


            }
        }
Run Code Online (Sandbox Code Playgroud)

ViewDidAppear:

  var previewLayer: AVCaptureVideoPreviewLayer?


override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        previewLayer!.frame = camera_Preview.bounds
    }
Run Code Online (Sandbox Code Playgroud)

Roi*_*lia 6

对于未来的读者:这是在您的应用程序中设置相机的正确过程。

首先,感谢上面那些花时间尝试帮助我的人。他们都指引我走向正确的方向。虽然比尔误会了viewDidLoad理论,但他确实给出了 Apple Project 的解决方案。

这个设置相机 - 正确的方法 - 比我想象的要复杂一点,按照文档给我带来了很好的结果。所以对于 Objective-C 的程序员:

Objective C cam 项目

斯威夫特凸轮项目

关于 Andrea 的回答,他确实说了一些在创建此类应用程序时应该考虑的重要提示。检查它们 - 它们高度相关(他在 Apple 项目中所说的大部分内容也是如此)。


Bil*_*son 5

罗伊,

我认为您的问题是您正在 viewWillAppear 中进行所有会话设置等。假设 captureSession 和 previewLayer 都已分配并正常工作。现在,您将应用程序置于后台并带回来。

您将立即尝试创建一个新的 captureSession 和一个新的 previewLayer。我怀疑旧的和新的正在纠缠在一起。

在 Apple AVCam 示例中,他们在 viewDidLoad 中进行设置。这样它只做一次。

您应该将所有设置内容移动到一个方法,然后从 viewDidLoad 调用该方法。

账单