ios - 切换到前置摄像头时 AVFoundation 摄像头崩溃(刷新摄像头)

标签 ios swift swift3 avfoundation ios-camera

我是 iOS 的新手,正在使用 swift 开发简单的应用程序,因为我需要一个自定义相机。我正在使用 AVFoundation,但该应用程序长时间显示黑屏,然后正在加载相机。这是我的代码

 func prepareCamera() {
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto
    if frontCam{
    if let availableDevices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .front).devices {
        captureDevice = availableDevices.first
        DispatchQueue(label: "prepare").async {
        self.beginSession()
        }
    }
    }else{
        if let availableDevices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back).devices {
            captureDevice = availableDevices.first
            beginSession()
        }
    }
}
@IBAction func switchCameraBtnClicked(_ sender: Any) {
    frontCam = !frontCam
    prepareCamera()
}
func beginSession () {

    do {
        let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice)
        if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] {
            for input in inputs {
                captureSession.removeInput(input)
            }
        }
        if captureSession.inputs.isEmpty {
     captureSession.addInput(captureDeviceInput)
        }

    }catch {
        print(error.localizedDescription)
    }


    if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
        self.previewLayer = previewLayer
      //  self.view.layer.addSublayer(self.previewLayer)
        self.view.layer.insertSublayer(self.previewLayer, at: 0)
        self.previewLayer.frame = self.view.layer.frame

        captureSession.startRunning()

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)]

        dataOutput.alwaysDiscardsLateVideoFrames = true

        if captureSession.canAddOutput(dataOutput) {
            captureSession.addOutput(dataOutput)
        }

        captureSession.commitConfiguration()


        let queue = DispatchQueue(label: "com.graymatics.customcamera")
        dataOutput.setSampleBufferDelegate(self, queue: queue)



    }

}

如果代码不正确,请纠正。

最佳答案

终于找到解决办法了

这是我的代码:

override func viewDidDisappear(_ animated: Bool) {
         self.stopCaptureSession()
    }


 func stopCaptureSession () {
        self.captureSession.stopRunning()

        if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] {
            for input in inputs {
                self.captureSession.removeInput(input)
            }
        }        
    }

从当前 View Controller 继续移动时需要停止 session 。

关于ios - 切换到前置摄像头时 AVFoundation 摄像头崩溃(刷新摄像头),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45589395/

相关文章:

objective-c - 在 Storyboard 中创建 FBProfilePictureView

ios - Jsqmessagesviewcontroller图像上传并在屏幕上显示非常慢触摸没有响应

arrays - 计算3个数组中键的总值

swift - 如何在不使用 Firebase 控制台的情况下发送推送通知

swift - 如何在线程实例上执行 block ?

ios - 为什么当我在 swift 3 中从图库中获取照片时, Collection View 为空?

ios - addArc(withCenter) 闭合路径

ios - 具有动态 header 的 UICollectionViewController(如 Reddit 应用程序)

ios - 我如何获得带有换行符的 UIBarButtonItem 标题?

ios - Swift 数组中的数组