AVFoundation 相机检查和翻转变量

AVFoundation Camera Check and Flip Variable

我创建了一个自定义相机工具。现在,我正在尝试检查是否存在摄像头,但是我只有模拟器(没有摄像头)和 iphone(两个摄像头)。我没有处理过相机,但我不明白它是如何在一个相机上工作的,所以我也不知道如何帮助用户翻转相机

目前我正在使用以下外部库 dojo custom camera

位置 .Back.Front 有效,我没有处理相机,但我不知道如何


// I call addVideoInput() while initializing

func addVideoInput() {
    if let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Front) {
        do {
            let input = try AVCaptureDeviceInput(device: device)
            if self.session.canAddInput(input) {
                self.session.addInput(input)
            }
        } catch {
            print(error)
        }
    }
}

func deviceWithMediaTypeWithPosition(mediaType: NSString, position: AVCaptureDevicePosition) -> AVCaptureDevice? {
    let devices: NSArray = AVCaptureDevice.devicesWithMediaType(mediaType as String)
    if devices.count != 0 {
        if var captureDevice: AVCaptureDevice = devices.firstObject as? AVCaptureDevice {

            for device in devices {
                let d = device as! AVCaptureDevice
                if d.position == position {
                    captureDevice = d
                    break;
                }
            }
            print(captureDevice)
            return captureDevice
        }
    }
    print("doesnt have any camera")
    return nil

}

最好保留枚举 IMO。

private enum CameraPosition {
    case Front, Back
}

然后当你按下按钮时有

var currentState: CameraPostition

切换到另一个相机位置。

然后在currentState的didSet上配置camera

var currentState: CameraPostition {
    didSet {
       configCamera(state: currentState)
    }
}

编辑:提供更多信息后。

如果你改变

func addVideoInput() {
        let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
        do {
            let input = try AVCaptureDeviceInput(device: device)
            if self.session.canAddInput(input) {
                self.session.addInput(input)
            }
        } catch {
            print(error)
        }
    }

func addVideoInput(position: AVCaptureDevicePosition) {
        let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: position)
        do {
            let input = try AVCaptureDeviceInput(device: device)
            if self.session.canAddInput(input) {
                self.session.addInput(input)
            }
        } catch {
            print(error)
        }
    }

然后当你的 "CurrentState" 在 currentState 的 didSet 上发生变化时,你可以调用该函数。

func configCamera(state: CameraState) {
      switch state{
         case .Back:
              addVideoInput(.Back)
         case .Front
              addVideoInput(.Front)
      }
}

您可以在第一次加载相机视图时使用布尔变量 isUsingFrontCamera,

设置,

isUsingFrontCamera = false;

然后点击相机切换按钮,

-(IBAction)switchCameras:(id)sender {
  AVCaptureDevicePosition desiredPosition;
  if (isUsingFrontFacingCamera)
      desiredPosition = AVCaptureDevicePositionBack;
  else
      desiredPosition = AVCaptureDevicePositionFront;

  for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
      if ([d position] == desiredPosition) {
          [[captureVideoPreviewLayer session] beginConfiguration];
          AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil];
          for (AVCaptureInput *oldInput in [[captureVideoPreviewLayer session] inputs]) {
              [[captureVideoPreviewLayer session] removeInput:oldInput];
          }
          [[captureVideoPreviewLayer session] addInput:input];
          [[captureVideoPreviewLayer session] commitConfiguration];
          break;
      }
  }
  isUsingFrontFacingCamera = !isUsingFrontFacingCamera;
}

其中captureVideoPreviewLayer是,

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer

此外,您可以使用

获取相机的数量
[[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count]

然后相应地显示和隐藏按钮

您需要删除该对象并使用少量值和布尔值创建新对象。

这里我post创建相机位置的代码AVCaptureDevicePosition

在 class 的顶部添加 enum

enum CameraType {
    case Front
    case Back
}

初始化变量。

var cameraCheck = CameraType.Back

只需更改以下功能即可。

func addVideoInput() {
        if cameraCheck ==  CameraType.Front  {
            cameraCheck = CameraType.Back
            let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Front)
            do {
                let input = try AVCaptureDeviceInput(device: device)
                if self.session.canAddInput(input) {
                    self.session.addInput(input)
                }
            } catch {
                print(error)
            }
        }else{
            cameraCheck = CameraType.Front
            let device: AVCaptureDevice = self.deviceWithMediaTypeWithPosition(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
            do {
                let input = try AVCaptureDeviceInput(device: device)
                if self.session.canAddInput(input) {
                    self.session.addInput(input)
                }
            } catch {
                print(error)
            }
        }        
    }

在您的 storyboard 中创建一个按钮。

现在进入你的 viewcontroller 创建一个 @IBAction 函数。

@IBAction func changeCamera(){
        self.camera = nil

        self.initializeCamera()
        self.establishVideoPreviewArea()

        if isBackCamera == true {
           isBackCamera = false
            self.camera?.cameraCheck = CameraType.Front
        }else{
            isBackCamera = true
            self.camera?.cameraCheck = CameraType.Back
        }
    }

这就是您的目标。

Also you can download the source code from here.