双击或使用button切换相机从后面到前面(Xcode 8,Swift 3)

所以,最近我一直试图在Swift 3中实现从后向前摄像头切换摄像头视图的function。但是,没有运气。

目前,我的默认视图是来自后置摄像头 – 我可以用它拍照,然后重拍。 但任何人都可以帮助我,并显示如何或者双击屏幕切换相机或只是使用分配的button来切换它们? 谢谢!

import UIKit import AVFoundation import FirebaseDatabase class CameraView: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { override var prefersStatusBarHidden: Bool { return true } var captureSession : AVCaptureSession! var stillImageOutput : AVCaptureStillImageOutput! var previewLayer : AVCaptureVideoPreviewLayer! @IBOutlet var cameraView: UIView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) previewLayer?.frame = cameraView.bounds } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) captureSession = AVCaptureSession() captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080 var backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) var error : NSError? do { var input = try! AVCaptureDeviceInput(device: backCamera) if (error == nil && captureSession?.canAddInput(input) != nil) { captureSession?.addInput(input) stillImageOutput = AVCaptureStillImageOutput() stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] if (captureSession?.canAddOutput(stillImageOutput) != nil) { captureSession?.addOutput(stillImageOutput) previewLayer = AVCaptureVideoPreviewLayer (session: captureSession) previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait cameraView.layer.addSublayer(previewLayer) captureSession?.startRunning() } } } catch { } } @IBOutlet var tempImageView: UIImageView! @IBAction func didPressTakePhoto(_ sender: UIButton) { if let videoConnection = stillImageOutput.connection(withMediaType: AVMediaTypeVideo) { videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait stillImageOutput.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) in if sampleBuffer != nil { var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) var dataProvider = CGDataProvider.init(data: imageData as! CFData) var cgImageRef = CGImage.init(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) var image = UIImage (cgImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.right) self.tempImageView.image = image self.tempImageView.isHidden = false } }) } } var didTakePhoto = Bool() @IBAction func didPressTakeAnother(_ sender: UIButton) { if didTakePhoto == true { tempImageView.isHidden = true didTakePhoto = false } else { captureSession?.startRunning() didTakePhoto = true } } } 

在这里没有看到任何问题 – 这里是工作的解决scheme:

 import Foundation import UIKit import AVFoundation class MainViewController: UIViewController { var tempImage: UIImageView? var captureSession: AVCaptureSession? var stillImageOutput: AVCaptureStillImageOutput? var videoPreviewLayer: AVCaptureVideoPreviewLayer? var currentCaptureDevice: AVCaptureDevice? var usingFrontCamera = false override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. loadCamera() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) videoPreviewLayer!.frame = self.cameraPreviewSurface.bounds } @IBAction func switchButtonAction(_ sender: Any) { usingFrontCamera = !usingFrontCamera loadCamera() } func getFrontCamera() -> AVCaptureDevice?{ let videoDevices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) for device in videoDevices!{ let device = device as! AVCaptureDevice if device.position == AVCaptureDevicePosition.front { return device } } return nil } func getBackCamera() -> AVCaptureDevice{ return AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) } func loadCamera() { if(captureSession == nil){ captureSession = AVCaptureSession() captureSession!.sessionPreset = AVCaptureSessionPresetPhoto } var error: NSError? var input: AVCaptureDeviceInput! currentCaptureDevice = (usingFrontCamera ? getFrontCamera() : getBackCamera()) do { input = try AVCaptureDeviceInput(device: currentCaptureDevice) } catch let error1 as NSError { error = error1 input = nil print(error!.localizedDescription) } for i : AVCaptureDeviceInput in (self.captureSession?.inputs as! [AVCaptureDeviceInput]){ self.captureSession?.removeInput(i) } if error == nil && captureSession!.canAddInput(input) { captureSession!.addInput(input) stillImageOutput = AVCaptureStillImageOutput() stillImageOutput?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] if captureSession!.canAddOutput(stillImageOutput) { captureSession!.addOutput(stillImageOutput) videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) videoPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill videoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.portrait //self.cameraPreviewSurface.layer.sublayers?.forEach { $0.removeFromSuperlayer() } self.cameraPreviewSurface.layer.addSublayer(videoPreviewLayer!) DispatchQueue.main.async { self.captureSession!.startRunning() } } } } } 

一些说明:

cameraPreviewSurface – 这是你的UIView相机将显示

不要重新分配会话,不要只是添加input,但在添加新的 – 删除现有的,

ps代码用swift 3.0.1 / xcode 8.1完成

干杯)