首页 > 解决方案 > AVFoundation 使用 Swift 切换按钮更改相机

问题描述

我使用 AVFoundation 创建自定义相机视图。

如果我只使用前置或后置摄像头,它可以工作,我可以拍照没有问题,但是当我使用切换按钮更换摄像头时它不起作用。

我认为这是一个会话问题,我需要在更改相机视图时删除会话。

我没有解决这个问题有人可以帮我解决问题吗?

这是我的代码:

 func getFrontCamera() -> AVCaptureDevice?{
    let videoDevice = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .front).devices.first
      return videoDevice
  }

func getBackCamera() -> AVCaptureDevice?{
    let videoDevice = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.back).devices.first
      return videoDevice
  }

func setUpCamera() {
    let session = AVCaptureSession()
    if usingFrontCamera {
    
        if let device = getFrontCamera() {
            do {
                let input = try AVCaptureDeviceInput(device: device)
                if session.canAddInput(input) {
                    session.addInput(input)
                }
                
                if session.canAddOutput(output) {
                    session.addOutput(output)
                }
                
                previewLayer.videoGravity = .resizeAspectFill
                previewLayer.session = session
                
                session.startRunning()
                self.session = session
            } catch {
                print(error)
            }
        }
    } else {
        if let device = getBackCamera() {
            do {
                
                let input = try AVCaptureDeviceInput(device: device)
    
                if (session.canAddInput(input)) {
                    session.addInput(input)
                }
                
                if (session.canAddOutput(output))  {
                    session.addOutput(output)
                }
                
                previewLayer.videoGravity = .resizeAspectFill
                previewLayer.session = session
                
                session.startRunning()
                self.session = session
            } catch {
                print(error)
            }
        }
    }
}

这是我的切换按钮:

    @IBAction func didChangeCamera(_ sender: Any) {
     usingFrontCamera = !usingFrontCamera
     setUpCamera()
    }

和 AVCapturePhotoDelegate:

extension CameraViewController: AVCapturePhotoCaptureDelegate {
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
    guard let data = photo.fileDataRepresentation() else {
        return
    }
    
    let image = UIImage(data: data)
    
    session?.stopRunning()
    
    let imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFill
    imageView.frame = view.bounds
    view.addSubview(imageView)
  }
}

它仅适用于一个相机视图,但我需要使用切换按钮。感谢大家...

标签: swiftavfoundationios-camera

解决方案


推荐阅读