2016-09-26 19 views
5

Vì vậy, gần đây tôi đã cố gắng thực hiện chức năng chuyển đổi chế độ xem máy ảnh từ quay lại camera trước trong Swift 3. Tuy nhiên, với không may mắn.Nhấn đúp hoặc sử dụng nút để chuyển đổi máy ảnh từ quay lại mặt trước (Xcode 8, Swift 3)

Hiện tại, chế độ xem mặc định của tôi là từ máy ảnh sau - tôi có thể chụp ảnh với máy ảnh và sau đó thực hiện lại. Nhưng bất cứ ai có thể giúp tôi và chỉ cho tôi cách nhấn đúp vào màn hình để chuyển đổi máy ảnh hoặc chỉ cần sử dụng nút được gán để chuyển đổi chúng? Cảm ơn bạn!

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 

    } 
} 
} 

Trả lời

5

không thấy bất kỳ vấn đề ở đây - đây là giải pháp làm việc:

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() 
       } 


      } 
     } 



    } 
} 

một số ghi chú:

cameraPreviewSurface - đây là UIView của bạn, nơi máy ảnh sẽ hiển thị

don' t gán lại phiên, không chỉ thêm đầu vào, nhưng trước khi thêm mới - hãy xóa dữ liệu hiện có,

p.s. mã được thực hiện với nhanh chóng 3.0.1/xcode 8.1

Chúc mừng)

+1

Cảm ơn ví dụ này. Tuy nhiên, phương pháp này đã phá vỡ cách của tôi để chụp một ảnh tĩnh từ nguồn cấp dữ liệu. Làm thế nào tôi có thể lấy một khung từ mã này? Có thể đăng câu hỏi mới nếu điều đó tốt hơn .. – MattEm

+0

sử dụng nếu để videoConnection = stillImageOutput.connection (withMediaType: AVMediaTypeVideo) { mà alwyas trả về false .. tại sao? – MattEm

+0

Phương pháp này không thành công nếu captureSession! .canAddOutput (stillImageOutput) bất ngờ tìm thấy nil, tại sao điều này? – MattEm

Các vấn đề liên quan