如何在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)