ios swift avfoundation video-capture

ios - ¿Cómo grabar un video con un toque en Swift?



avfoundation video-capture (1)

Estoy tratando de averiguar cómo grabar un video usando AVFoundation en Swift. Llegué a crear una cámara personalizada, pero solo descubrí cómo tomar fotos fijas con ella y no puedo averiguar cómo grabar videos. Por lo que entiendo, debe usar AVCaptureVideoDataOutput para obtener los datos de la grabación, pero no puedo averiguar cómo iniciar la grabación e implementar los métodos de delegado.

Toda la Guía de programación de AVFoundation / Captura de imágenes fijas y video está en Objective-C y parece que no puedo descifrarla. Aquí está mi intento de realizar esta tarea:

Primero configuro la cámara / sesión de captura.

override func viewDidLoad() { super.viewDidLoad() captureSession.sessionPreset = AVCaptureSessionPresetHigh let devices = AVCaptureDevice.devices() for device in devices { if (device.hasMediaType(AVMediaTypeVideo)) { if(device.position == AVCaptureDevicePosition.Back) { captureDevice = device as? AVCaptureDevice if captureDevice != nil { beginSession() } } } } }

Luego, una vez que se llama a beginSession (), configuro el feed en vivo.

func beginSession() { var err : NSError? = nil captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err)) if err != nil { println("error: /(err?.localizedDescription)") } previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) self.cameraView.layer.addSublayer(previewLayer) self.cameraView.bringSubviewToFront(takePhotoButton) self.cameraView.bringSubviewToFront(self.snappedPicture) self.cameraView.bringSubviewToFront(self.backButton) previewLayer?.frame = self.cameraView.layer.frame captureSession.startRunning() }

Aquí es donde me quedo atascado donde el usuario presiona grabar para grabar y capturar un video:

@IBAction func takeVideoAction(sender: AnyObject) { var recordingDelegate:AVCaptureFileOutputRecordingDelegate? = self var videoFileOutput = AVCaptureMovieFileOutput() self.captureSession.addOutput(videoFileOutput) let filePath = NSURL(fileURLWithPath: "filePath") videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate) }

Entonces llamo self.videoFileOutput.stopRecording() .

Luego, por último, los métodos de delegado.

func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) { return } func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) { return }

Y nada sucede como se puede imaginar porque no puedo descubrir cómo implementarlo correctamente.


He intentado su código. Cuando se establece un filePath significativo, todo va bien. Cambie su filePath esta manera y obtendrá los métodos de delegación invocados:

let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] let filePath = documentsURL.URLByAppendingPathComponent("temp") // Do recording and save the output to the `filePath` videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)