2017-06-14 6 views
1

J'essaie d'intégrer une vue de caméra personnalisée et de suivre un code légèrement obsolète. J'ai eu plusieurs erreurs, mais je les ai cru fixé bar 2.Intégration de la caméra personnalisée Voir AVCaptureDevice

Voici le code actuel jusqu'à présent:

import Foundation 
import AVFoundation 
import UIKit 

class setupView : UIViewController { 

@IBOutlet var cameraView: UIView! 
@IBOutlet var nameTextField: UITextField! 

var captureSession = AVCaptureSession() 
var stillImageOutput = AVCapturePhotoOutput() 
var previewLayer = AVCaptureVideoPreviewLayer() 

override func viewDidLoad() { 

     let session = AVCaptureDeviceDiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back) 
    if let device = session?.devices[0] { 

     if device.position == AVCaptureDevicePosition.back { 

      do { 

       let input = try AVCaptureDeviceInput(device: device) 
       if captureSession.canAddInput(input){ 
        captureSession.addInput(input) 
        stillImageOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 

        if captureSession.canAddOutput(stillImageOutput) { 
         captureSession.addOutput(stillImageOutput) 
         captureSession.startRunning() 

         previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
         previewLayer.AVLayerVideoGravityResizeAspectFill 
         previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
         cameraView.layer.addSublayer(previewLayer) 

         previewLayer.bounds = cameraView.frame 
         previewLayer.position = CGPoint(x: cameraView.frame.width/2, y:cameraView.frame.height/2) 

        } 

       } 

      }    catch { 



      } 
     } 
    } 

} 

@IBAction func takePhoto(_ sender: Any) { 
    } 

@IBAction func submitAction(_ sender: Any) { 

} 
} 

Je reçois actuellement 2 erreurs:

" Une valeur de type AVCapturePhotoOutput "n'a pas membre "OutputSettings"

" valeur de type "AVCaptureVideoPreviewLayer" n'a pas membre "AVLayerVideoGravityResizeAspectFill"

+0

L'erreur « Valeur de type AVCapturePhotoOutput » Aucun membre "outputSettings" n'est supprimé si je retourne à AVCaptureStillImageOutput à la place, mais cela a été déprécié. –

Répondre

0
import AVFoundation 
    import Foundation 
    @IBOutlet weak var mainimage: UIImageView! 
    let captureSession = AVCaptureSession() 
    let stillImageOutput = AVCaptureStillImageOutput() 
    var previewLayer : AVCaptureVideoPreviewLayer? 
    var captureDevice : AVCaptureDevice? 
     override func viewDidLoad() { 
     super.viewDidLoad() 
      captureSession.sessionPreset = AVCaptureSessionPresetHigh 

      if let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] { 
       // Loop through all the capture devices on this phone 
       for device in devices { 
        // Make sure this particular device supports video 
        if (device.hasMediaType(AVMediaTypeVideo)) { 
         // Finally check the position and confirm we've got the back camera 
         if(device.position == AVCaptureDevicePosition.front) { 
          captureDevice = device 
          if captureDevice != nil { 
           print("Capture device found") 
           beginSession() 
          } 
         } 
        } 
       } 
      } 


    } 



func beginSession() { 

     do { 
      try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice)) 
      stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG] 

      if captureSession.canAddOutput(stillImageOutput) { 
       captureSession.addOutput(stillImageOutput) 
      } 

     } 
     catch { 
      print("error: \(error.localizedDescription)") 
     } 

     guard let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) else { 
      print("no preview layer") 
      return 
     } 

     self.view.layer.addSublayer(previewLayer) 
     previewLayer.frame = self.view.layer.frame 
     captureSession.startRunning() 
     self.view.addSubview(mainimage) 

    } 

Ce code fonctionne dans mon application

1

Vous y êtes presque. Le problème est que certaines classes d'AVFoundation sont obsolètes et qu'il y a plus d'une façon de prendre une photo maintenant. Voici les problèmes avec votre code.

"Valeur de type AVCapturePhotoOutput" n'a aucun membre "OutputSettings"

Il est en fait parce que AVCapturePhotoOutput n'ont pas de membre défini comme outputSettings. Consultez plein documentation de AVCapturePhotoOutput

En fait outputSettings est membre de AVCaptureStillImageOutput et le même est dépréciée de iOS 10,0

« Valeur de type "AVCaptureVideoPreviewLayer" n'a pas membre "AVLayerVideoGravityResizeAspectFill"

Encore une fois la même erreur, selon votre code, il n'y a pas de membre pour AVCaptureVideoPreviewLayer.Si vous voulez définir la couche de prévisualisation vidéo, réglez-la comme ci-dessous:

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 

Comme vous l'avez mentionné, comme le code est obsolète et son utilisant dépréciée AVCaptureStillImageOutput

Si vraiment envie d'utiliser AVCapturePhotoOutput alors vous devez suivre les étapes ci-dessous.

Voici les étapes pour capturer une photo.

  • Créez un objet AVCapturePhotoOutput. Utilisez ses propriétés pour déterminer les paramètres de capture pris en charge et pour activer certaines fonctionnalités (par exemple, si vous souhaitez capturer des photos en direct).
  • Créez et configurez un objet AVCapturePhotoSettings pour choisir les caractéristiques et les paramètres d'une capture spécifique (par exemple, activer ou désactiver la stabilisation d'image).
  • Capturez une image en passant votre objet de paramètres photo à la méthode capturePhoto (avec: delegate :) avec un objet délégué implémentant le protocole AVCapturePhotoCaptureDelegate. La sortie de capture photo appelle ensuite votre délégué pour vous informer des événements significatifs au cours du processus de capture.

avez ce code ci-dessous sur votre méthode clickCapture et ne pas oublier de confirmer et mettre en œuvre pour déléguer dans votre classe.

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 
self.cameraOutput.capturePhoto(with: settings, delegate: self) 

si vous souhaitez connaître les différentes façon de capturer photo de avfoundation vérifier ma précédente SO answer

également la documentation d'Apple explique très clairement How to use AVCapturePhotoOutput