簡體   English   中英

Swift 4 Capture Photo,photoOutput返回nil

[英]Swift 4 Capture Photo, photoOutput returns nil

目前,我有兩個不同的視圖控制器和一個在它們之間切換的按鈕。 我希望在每張照片上都能拍攝到設備輸入的照片。

目前,我可以拍攝后置攝像頭的照片以進行處理,並且效果很好,但是當我嘗試在第二個視圖的另一個控制器中編寫相同的代碼時,照片輸出將返回nil,但是當我記錄每個設備時,仍然顯示前后攝像頭。

我是新手,不知道為什么會這樣。

ViewController類,viewDidLoad和變量:

class AddUserController: UIViewController , AVCaptureVideoDataOutputSampleBufferDelegate , UITextFieldDelegate{

   //variable for captureing video feed
   var captureSessionFront = AVCaptureSession()
   //variable for rendering camera to the view
   var videoPreviewLayer: AVCaptureVideoPreviewLayer?

   var frontCamera: AVCaptureDevice?
   var backCamera: AVCaptureDevice?
   var currentCamera2: AVCaptureDevice?
   var PhotoOutputFront: AVCapturePhotoOutput?
   var cameraPreviewLayer2: AVCaptureVideoPreviewLayer?

   var tempImage: UIImage?

   var tempstring: String?

   private var maskLayer = [CAShapeLayer]()



   @IBOutlet weak var textField: UITextField!

   //button action to save the user to the collection
   @IBAction func saveFaceBtn(_ sender: Any) {
       let settings = AVCapturePhotoSettings()
       PhotoOutputFront?.capturePhoto(with: settings, delegate: self)
       //print(PhotoOutputFront!)
   }

   override func viewDidLoad() {
       super.viewDidLoad()
       // Do any additional setup after loading the view, typically from a nib.

       //hide keyboard
       self.textField.delegate = self

       //video capture functions
       setupCaptureSession()
       setupDevice()
       setupInputOutput()
       setupPreview()
       startRunningCaptureSession()

職能:

func setupCaptureSession() {
       captureSessionFront.sessionPreset = AVCaptureSession.Preset.photo
   }
func setupDevice() {

       //discover devices
       let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(
           deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera],
           mediaType: AVMediaType.video,
           position: AVCaptureDevice.Position.unspecified)

       //find devices and check if frint or back cameras discovered
       let devices = deviceDiscoverySession.devices

       for device in devices{
           print(device)
           if device.position == AVCaptureDevice.Position.front{
               frontCamera = device

           } else if device.position == AVCaptureDevice.Position.back{
               backCamera = device
           }
       }

       currentCamera2 = frontCamera

   }

   func setupInputOutput() {

       do
       {

           let captureDeviceInput2 = try AVCaptureDeviceInput(device: currentCamera2!)

           captureSessionFront.addInput(captureDeviceInput2)
           PhotoOutputFront?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
           print(PhotoOutputFront)
       }
       catch
       {
           print(error)
       }
   }

   func setupPreview() {
       cameraPreviewLayer2 = AVCaptureVideoPreviewLayer(session: captureSessionFront)
       cameraPreviewLayer2?.videoGravity = AVLayerVideoGravity.resizeAspectFill
       cameraPreviewLayer2?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
       cameraPreviewLayer2?.frame = self.view.frame
       self.view.layer.insertSublayer(cameraPreviewLayer2!, at: 0)
   }

   func startRunningCaptureSession() {
       captureSessionFront.startRunning()
   }

擴展名,用於保存捕獲的照片:

extension AddUserController: AVCapturePhotoCaptureDelegate {

   func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
       print("before if let")
       if let imageData = photo.fileDataRepresentation(){
           tempImage = UIImage(data: imageData)
           print(tempImage!)

           //check to see if name is empty
           let tempstring = self.textField.text
           if(tempstring != nil || tempstring != ""){

               print(tempstring!)
               //addPhotoToCollection()
           }


       }
   }

}

必須設置輸入輸出,但是我不確定哪里出了問題,因為此代碼適用於我的主視圖控制器中的后置攝像頭。 我認為這與該功能有關,因為在我的其他控制器“ PhotoOutput”中不會返回nil。 此處“ PhotoOutputFront”返回nil。

view    func setupInputOutput() {

       do
       {

           let captureDeviceInput2 = try AVCaptureDeviceInput(device: currentCamera2!)

           captureSessionFront.addInput(captureDeviceInput2)
           PhotoOutputFront?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
           print(PhotoOutputFront)
       }
       catch
       {
           print(error)
       }
   }

任何幫助將不勝感激。 提前致謝!

問題是我沒有將捕獲設備添加為捕獲會話的輸入,也沒有添加捕獲會話的輸出。

希望這對使用捕獲設備遇到麻煩的其他人有所幫助。 :)

func setupInputOutput() {

       do
       {

           let captureDeviceInput2 = try AVCaptureDeviceInput(device: currentCamera2!)

           captureSessionFront.addInput(captureDeviceInput2)
           PhotoOutputFront = AVCapturePhotoOutput()
           PhotoOutputFront?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
           captureSessionFront.addOutput(PhotoOutputFront!)
       }
       catch
       {
           print(error)
       }
   }

添加輸出:

if captureSessionFront?.canAddOutput(PhotoOutputFront) {
  let settings = AVCapturePhotoSettings()
  let previewPixelType = 
  settings.__availablePreviewPhotoPixelFormatTypes.first!
  let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
                   kCVPixelBufferWidthKey as String: 160,
                   kCVPixelBufferHeightKey as String: 160]
  settings.previewPhotoFormat = previewFormat
  settings.isHighResolutionPhotoEnabled = 
  PhotoOutputFront.isHighResolutionCaptureEnabled
  PhotoOutputFront.setPreparedPhotoSettingsArray([settings], completionHandler: { (finished, anError) in
    guard let error = anError else { return }
    debugPrint("Failed to set photo settings with: \(error.localizedDescription)")
  })
  captureSessionFront.addOutput(PhotoOutputFront)
}

在添加輸出之前,請添加輸入:

if captureSessionFront.canAddInput(captureDeviceInput2) {
    captureSessionFront.addInput(captureDeviceInput2)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM