Swift: toma una foto de AVFoundation

Quiero traducir esta function de obj c a swift, pero no puedo traducir una parte del código. ¿Podría alguien explicarme cómo tomar fotos de AVFondation o ayudarme a traducir esta function?

- (void) capImage { //method to capture image from AVCaptureSession video feed AVCaptureConnection *videoConnection = nil; for (AVCaptureConnection *connection in stillImageOutput.connections) { for (AVCaptureInputPort *port in [connection inputPorts]) { if ([[port mediaType] isEqual:AVMediaTypeVideo] ) { videoConnection = connection; break; } } if (videoConnection) { break; } } NSLog(@"about to request a capture from: %@", stillImageOutput); [stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) { if (imageSampleBuffer != NULL) { NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; [self processImage:[UIImage imageWithData:imageData]]; } }]; } 

Lo que hice pero no funcionó:

  func takePhoto(sender:UIButton){ var videoConnection:AVCaptureConnection var connection:AVCaptureConnection var port : AVCaptureInputPort for connection in stillImageOutput?.connections { for (port in connection.inputPorts as AVCaptureInputPort) { if port = AVMediaTypeVideo { videoConnection = connection break } } if videoConnection { break } } stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {(imageSampleBuffer, error) in if (imageSampleBuffer != nil) { var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer as CMSampleBuffer) var image: UIImage = UIImage(data: imageData) } }) } 

¿Podría alguien ayudarme?

Como el código anterior no funcionó, encontré una solución elegante en Swift.

En lugar de esto:

 var videoConnection : AVCaptureConnection? for connection in self.stillImageOutput.connections{ for port in connection.inputPorts!{ if port.mediaType == AVMediaTypeVideo{ videoConnection = connection as? AVCaptureConnection break //for ports } } if videoConnection != nil{ break //for connections } }//take a photo then 

Debe usar esto:

 if let videoConnection = stillImageOuput.connectionWithMediaType(AVMediaTypeVideo){//take a photo here} 

¡Espero que ayude!

Ok encontré la solución:

  func takePhoto(){ if let stillOutput = self.stillImageOutput { // we do this on another thread so that we don't hang the UI dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { //find the video connection var videoConnection : AVCaptureConnection? for connecton in stillOutput.connections { //find a matching input port for port in connecton.inputPorts!{ if port.mediaType == AVMediaTypeVideo { videoConnection = connecton as? AVCaptureConnection break //for port } } if videoConnection != nil { break// for connections } } if videoConnection != nil { stillOutput.captureStillImageAsynchronouslyFromConnection(videoConnection){ (imageSampleBuffer : CMSampleBuffer!, _) in let imageDataJpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer) var pickedImage: UIImage = UIImage(data: imageDataJpeg) } self.captureSession.stopRunning() } } } }