如何在Swift中录制video与avfoundation?

我想弄清楚如何在Swift中使用AVFoundation录制video。 我已经尽可能地创造了一个定制的相机,但我只是想出了如何拍摄静态照片,我不知道如何录制video。 从我的理解你必须使用AVCaptureVideoDataOutput获取录音的数据,但我不知道如何开始录制和实施委托方法。

整个AVFoundation编程指南/静态和video媒体捕捉是在Objective-C中,我似乎无法破译出来。 我试图完成这个任务:

首先,我设置相机/捕捉会话

 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() } } } } } 

然后,一旦beginSession()被调用,我设置了活动提要

 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() } 

这里是我卡在哪里用户按logging实际logging和捕捉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) } 

然后我调用self.videoFileOutput.stopRecording()

最后是委托方法

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

没有任何事情可以想象,因为我无法弄清楚如何正确实现它。

我已经试过你的代码。 当设置一个有意义的文件filePath ,一切都很好。 像这样改变你的filePath ,你将得到调用的委托方法:

  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)