Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AvCam ios从后摄像头到前摄像头的切换速度非常慢,我如何解决这个问题?_Ios_Avfoundation_Ios Camera - Fatal编程技术网

AvCam ios从后摄像头到前摄像头的切换速度非常慢,我如何解决这个问题?

AvCam ios从后摄像头到前摄像头的切换速度非常慢,我如何解决这个问题?,ios,avfoundation,ios-camera,Ios,Avfoundation,Ios Camera,///在切换之前,我完全确定isRunning==true func toggleCamera(){ let first:TimeInterval = Date().timeIntervalSince1970 let currentVideoDevice = self.videoInput.device ///////////////begin to switch self.captureSession.beginConfig

///在切换之前,我完全确定isRunning==true

   func toggleCamera(){
        let first:TimeInterval = Date().timeIntervalSince1970
        let currentVideoDevice = self.videoInput.device
        ///////////////begin to switch
        self.captureSession.beginConfiguration()
        self.captureSession.removeInput(self.videoInput)
        if self.cameraDeviceType == .back {
            self.cameraDeviceType = .front
            self.inputCamera = self.frontDevice
        }else{
            self.cameraDeviceType = .back
            self.inputCamera = self.backDevice
        }
        do {
            self.videoInput = try AVCaptureDeviceInput(device:self.inputCamera)
        } catch {
            print(error)
        }
        if self.captureSession.canAddInput(self.videoInput) {
            NotificationCenter.default.removeObserver(self, name: .AVCaptureDeviceSubjectAreaDidChange, object: currentVideoDevice)
            NotificationCenter.default.addObserver(self, selector: #selector(self.subjectAreaDidChange), name: .AVCaptureDeviceSubjectAreaDidChange, object: self.videoInput.device)

            self.captureSession.addInput(self.videoInput)
        } else {
            self.captureSession.addInput(self.videoInput)
        }
        self.captureSession.commitConfiguration()
        if let connection = self.videoOutput?.connection(withMediaType: "video") {
            if connection.isVideoStabilizationSupported {
                connection.preferredVideoStabilizationMode = .auto
            }
            connection.isEnabled = false
            connection.isEnabled = true
        }
        let second:TimeInterval = Date().timeIntervalSince1970
        print("turnAroundInnerCost:",second-first)
    }
////日志:0.431715965270996
///运行时间很快,但界面切换速度很慢,大约5秒,因此,每次切换都会重新创建相机、重新配置设备、启用/禁用连接等。尝试将相机配置逻辑移动到其他功能,并调用一次,例如在viewDidLoad中

摄像机之间的切换可以是:

     func switchToFrontCamera() throws {
            guard let inputs = captureSession.inputs as? [AVCaptureInput], let rearCameraInput = self.rearCameraInput, inputs.contains(rearCameraInput),
                let frontCamera = self.frontCamera else { throw CameraError.invalidOperation }

            self.frontCameraInput = try AVCaptureDeviceInput(device: frontCamera)

            captureSession.removeInput(rearCameraInput)

            if captureSession.canAddInput(self.frontCameraInput) {
                captureSession.addInput(self.frontCameraInput)

                self.currentCameraPosition = .front
            }

            else {
                throw CameraError.invalidOperation
            }
        }

     func switchToRearCamera() throws {
            guard let inputs = captureSession.inputs as? [AVCaptureInput], let frontCameraInput = self.frontCameraInput, inputs.contains(frontCameraInput),
                let rearCamera = self.rearCamera else { throw CameraError.invalidOperation }

            self.rearCameraInput = try AVCaptureDeviceInput(device: rearCamera)

            captureSession.removeInput(frontCameraInput)

            if captureSession.canAddInput(self.rearCameraInput) {
                captureSession.addInput(self.rearCameraInput)

                self.currentCameraPosition = .rear
            }

            else { throw CameraError.invalidOperation }
        }
然后你可以打电话

  switch currentCameraPosition {
    case .front:
        try switchToRearCamera()

    case .rear:
        try switchToFrontCamera()
  }

//在viewDid中创建captureSession一次,但当我将摄像头从后向前更换时,该功能运行速度仍然很慢

let frontDevice = AVCaptureDevice.devices(withMediaType:AVMediaTypeVideo).map { $0 as! AVCaptureDevice }.filter { $0.position == .front}.first!

let backDevice = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo).map { $0 as! AVCaptureDevice }.filter { $0.position == .back}
    .first!

public func turnAroundCamera() {
    sessionQueue.async {
        let first:TimeInterval = Date().timeIntervalSince1970
        let oldVedioInput = self.videoInput

        //self.captureSession.beginConfiguration()

        self.captureSession.removeInput(self.videoInput)
        if self.cameraDeviceType == .back {
            self.cameraDeviceType = .front
            self.inputCamera = self.frontDevice
        }else{
            self.cameraDeviceType = .back
            self.inputCamera = self.backDevice
        }
        do {
            self.videoInput = try AVCaptureDeviceInput(device:self.inputCamera)
        } catch {
            print(error)
        }

        if self.captureSession.canAddInput(self.videoInput) {
            self.captureSession.addInput(self.videoInput)
        }else{
            self.captureSession.addInput(oldVedioInput)
        }
        //self.captureSession.commitConfiguration()

        let second:TimeInterval = Date().timeIntervalSince1970
        print("turnAroundInnerCost:",second-first)
    }
}
更多信息,日志成本:0.245857000350952


实际上,当我调用这个函数时,它运行得很快,但是captureOutput在摄像头端后5秒左右运行缓慢。这很费时,特别是当我试图将摄像头从后面转到前面时。因此,我尝试启用/禁用的是刷新希望刷新captureOutput的会话。…

我在下面发布我现在的逻辑