Как переключить камеру с помощью AVFoundation - PullRequest
0 голосов
/ 01 января 2019

Я реализовал камеру предварительного просмотра, используя AVFoundation , она работает нормально.Но мне трудно переключать камеру назад и вперед.Я добавил кнопку переключателя на нижней панели.По умолчанию это задняя камера, я хочу переключить ее на фронт.Как я могу это сделать?

class FifteenSecsViewController: UIViewController, AVCaptureFileOutputRecordingDelegate {

    @IBOutlet weak var camPreview: UIView!
    let captureSession = AVCaptureSession()
    let movieOutput = AVCaptureMovieFileOutput()
    var previewLayer: AVCaptureVideoPreviewLayer!
    var activeInput: AVCaptureDeviceInput!
    var outputURL: URL!

    override func viewDidLoad() {
    super.viewDidLoad()

        if setupSession() {
            setupPreview()
            startSession()
        }
        self.switchCameraButton.addTarget(self, action: #selector(switchButtonTapped), for: .touchUpInside)
    }

    func setupSession() -> Bool {

    captureSession.sessionPreset = AVCaptureSession.Preset.high

    // Setup Camera
    let camera: AVCaptureDevice?

    camera = AVCaptureDevice.default(for: .video)
    do {
        let input = try AVCaptureDeviceInput(device: camera!)
        if captureSession.canAddInput(input) {
            captureSession.addInput(input)
            activeInput = input
        }
    } catch {
        print("Error setting device video input: \(error)")
        return false
    }

    // Setup Microphone
    let microphone = AVCaptureDevice.default(for: .audio)

    do {
        let micInput = try AVCaptureDeviceInput(device: microphone!)
        if captureSession.canAddInput(micInput) {
            captureSession.addInput(micInput)
        }
    } catch {
        print("Error setting device audio input: \(error)")
        return false
    }


    // Movie output
    let seconds : Int64 = 3
    let maxDuration = CMTime(seconds: Double(seconds), 
    preferredTimescale: 1)
    movieOutput.maxRecordedDuration = maxDuration
    if captureSession.canAddOutput(movieOutput) {
        captureSession.addOutput(movieOutput)
    }

    return true
    }

    func setupPreview() {
    // Configure previewLayer
        previewLayer = AVCaptureVideoPreviewLayer(session: 
        captureSession)
        previewLayer.frame = camPreview.bounds
        previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        camPreview.layer.addSublayer(previewLayer)
    }

        //MARK:- Camera Session
    func startSession() {      
        if !captureSession.isRunning {
            videoQueue().async {
                self.captureSession.startRunning()
            }
        }
    }

    @objc func switchButtonTapped(){
    // what to write here??
    }

}

Функция switchButtonTapped представляет собой цель action UIButton .Если я добавлю этот код в эту кнопку:

@objc func switchButtonTapped(){

    if setupSession() {
        setupPreview()
        startSession()
    }
}

Camerapreview экран показывает белый экран и застрял.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Попробуйте этот код:

func switchCamera() {
    session?.beginConfiguration()
    let currentInput = session?.inputs.first as? AVCaptureDeviceInput
    session?.removeInput(currentInput!)
    let newCameraDevice = currentInput?.device.position == .back ? getCamera(with: .front) : getCamera(with: .back)
    let newVideoInput = try? AVCaptureDeviceInput(device: newCameraDevice!)
    session?.addInput(newVideoInput!)
    session?.commitConfiguration()
}
0 голосов
/ 01 января 2019

Для начала создайте вход устройства для фронтальной камеры:

let frontDevice: AVCaptureDevice? = {
  for device in AVCaptureDevice.devices(for: AVMediaType.video) {
    if device.position == .front {
      return device
    }
  }

  return nil
}()

lazy var frontDeviceInput: AVCaptureDeviceInput? = {
  if let _frontDevice = self.frontDevice {
    return try? AVCaptureDeviceInput(device: _frontDevice)
  }

  return nil
}()

Затем в вашем switchButtonTapped, если есть фронтальная камера, вы можете переключаться между передней и той:

func switchButtonTapped() {
  if let _frontDeviceInput = frontDeviceInput {
    captureSession.beginConfiguration()

    if let _currentInput = captureSession.inputs.first as? AVCaptureDeviceInput {
      captureSession.removeInput(_currentInput)

      let newDeviceInput = (_currentInput.device.position == .front) ? activeInput : _frontDeviceInput
      captureSession.addInput(newDeviceInput!)
    }

    captureSession.commitConfiguration()
  }
}

Если вам нужна дополнительная информация, не стесняйтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...