2015-04-28 7 views
6

Ho creato un AVCaptureSession per acquisire l'output video e visualizzarlo all'utente tramite UIView. Ora voglio essere in grado di fare clic su un pulsante (metodo TakePhoto) e visualizzare l'immagine dalla sessione in un UIImageView. Ho provato a scorrere tutte le connessioni dei dispositivi e provare a salvare l'output, ma questo non ha funzionato. Il codice che ho è sottoSessione AVCapture per acquisire l'immagine SWIFT

let captureSession = AVCaptureSession() 
var stillImageOutput: AVCaptureStillImageOutput! 

@IBOutlet var imageView: UIImageView! 
@IBOutlet var cameraView: UIView! 


// If we find a device we'll store it here for later use 
var captureDevice : AVCaptureDevice? 

override func viewDidLoad() { 
    // Do any additional setup after loading the view, typically from a nib. 
    super.viewDidLoad() 
    println("I AM AT THE CAMERA") 
    captureSession.sessionPreset = AVCaptureSessionPresetLow 
    self.captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    if(captureDevice != nil){ 
     beginSession() 
    } 
} 
    func beginSession() { 

    self.stillImageOutput = AVCaptureStillImageOutput() 
    self.captureSession.addOutput(self.stillImageOutput) 
    var err : NSError? = nil 
    self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureDevice, error: &err)) 

    if err != nil { 
     println("error: \(err?.localizedDescription)") 
    } 

    var previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) 
    self.cameraView.layer.addSublayer(previewLayer) 
    previewLayer?.frame = self.cameraView.layer.frame 
    captureSession.startRunning() 
} 

@IBAction func takePhoto(sender: UIButton) { 
    self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)) { (buffer:CMSampleBuffer!, error:NSError!) -> Void in 
     var image = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
     var data_image = UIImage(data: image) 
     self.imageView.image = data_image 
    } 
} 
} 
+0

Ottenere questo errore ora 'terminazione app a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: '*** Impossibile aggiungere uscita per catturare sessione -> -> perché più di un output dello stesso tipo è unsupported.'' –

+0

Inizia prendendo la linea: captureSession.addOutput (self.stillImageOutput) e vedi dove stai aggiungendo. Questo dovrebbe risolvere l'errore. – user3353890

+0

@ user3353890 ho corretto l'errore (ho aggiornato il codice precedente) ma ora sto ottenendo solo un'immagine statica per la mia anteprima invece del video dalla videocamera ...? –

risposta

4

Si dovrebbe provare ad aggiungere un nuovo thread durante l'aggiunta di input e output per la sessione prima di avviarlo. Nella documentazione di Apple affermano

Importante: Il metodo startRunning è una chiamata di blocco che può richiedere un certo tempo, quindi è necessario eseguire l'installazione di sessione in una coda di serie in modo che la coda principale non è bloccato (che mantiene l'interfaccia utente reattivo). Vedi AVCam per iOS per l'esempio di implementazione canonica.

Provare a utilizzare un dispaccio nel metodo creare sessione, come di seguito

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { // 1 
     self.captureSession.addOutput(self.stillImageOutput) 
     self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureDevice, error: &err)) 
     self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto 
     if err != nil { 
      println("error: \(err?.localizedDescription)") 
     } 
     var previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) 
     previewLayer?.frame = self.cameraView.layer.bounds 
     previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
     dispatch_async(dispatch_get_main_queue(), { // 2 
        // 3 
      self.cameraView.layer.addSublayer(previewLayer) 
      self.captureSession.startRunning() 
      }); 
     }); 
+0

Grazie per aver finito! –

Problemi correlati