Grabación de video usando AVFoundation Swift

Creé una AVCaptureSession y manipulé cada fotogtwig (morphing) a los usuarios, agregué capas, etc. ¿Cómo puedo convertir esos fotogtwigs en un video que se puede save en el rollo de la camera?

Así es como AVCaptureSession

 func setupCapture() { let session : AVCaptureSession = AVCaptureSession() session.sessionPreset = AVCaptureSessionPreset640x480 let device : AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) let deviceInput : AVCaptureDeviceInput = try! AVCaptureDeviceInput(device: device) if session.canAddInput(deviceInput) { session.addInput(deviceInput) } stillImageOutput = AVCaptureStillImageOutput() videoDataOutput = AVCaptureVideoDataOutput() let rgbOutputSettings = [kCVPixelBufferPixelFormatTypeKey as String: NSNumber(unsignedInt: kCMPixelFormat_32BGRA)] videoDataOutput.videoSettings = rgbOutputSettings videoDataOutput.alwaysDiscardsLateVideoFrames = true videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL) videoDataOutput.setSampleBufferDelegate(self, queue: videoDataOutputQueue) if session.canAddOutput(videoDataOutput) { session.addOutput(videoDataOutput) } videoDataOutput.connectionWithMediaType(AVMediaTypeVideo).enabled = false effectiveScale = 1.0 previewLayer = AVCaptureVideoPreviewLayer(session: session) previewLayer.backgroundColor = UIColor.blackColor().CGColor previewLayer.videoGravity = AVLayerVideoGravityResizeAspect let rootLayer : CALayer = previewView.layer rootLayer.masksToBounds = true previewLayer.frame = rootLayer.bounds rootLayer.addSublayer(previewLayer) session.startRunning() } 

Que uso el CMSampleBuffer para get un CIImage que agrego mis efectos.

 func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { let pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)! let attachments : CFDictionaryRef = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, pixelBuffer, CMAttachmentMode( kCMAttachmentMode_ShouldPropagate))! let ciImage : CIImage = CIImage(CVPixelBuffer: pixelBuffer, options: attachments as? [String : AnyObject]) 

¿Cómo puedo grabar video haciendo esto?

Encontré una solución a tu problema. Yo también estoy trabajando en Swift y tenía la misma pregunta. Estoy agradecido de que haya publicado esta pregunta porque me ayudó mucho. Pude procesar los cuadros con éxito y luego escribirlos en el rollo de la camera. No lo he perfeccionado, pero es posible.

Resulta que una vez que comienza a jugar con AVCaptureDataOutput, supuestamente pierde la capacidad de utilizar AVCaptureMovieFileOutput, consulte la discusión aquí .

Aquí puede encontrar una solución concisa a su problema. Esta es la versión que implementé. Alimente el sampleBuffer con el object AVAssetWriterInput.

Una guía más detallada para resolver el problema describe exactamente qué partes (es decir, AVAssetWriter, AVAssetWriterInput y outSettings, etc.) son necesarias y cómo se ven.

Los enlaces que publiqué están en obj-c pero se pueden traducir a swift. Espero que ya hayas resuelto tu problema.