Ios 如何在Swift中使用avfoundation录制视频?

Ios 如何在Swift中使用avfoundation录制视频?,ios,swift,avfoundation,video-capture,Ios,Swift,Avfoundation,Video Capture,我想知道如何在Swift中使用AVFoundation录制视频。我已经制作了一个定制相机,但我只知道如何用它拍摄静态照片,却不知道如何录制视频。据我所知,您必须使用avcapturedevideodataoutput从录制中获取数据,但我不知道如何开始录制并实现委托方法 整个AVFoundation编程指南/静态和视频媒体捕获都是Objective-C,我似乎无法解释它。以下是我完成这项任务的尝试: 首先,我设置了照相机/拍摄会话 override func viewDidLoad() {

我想知道如何在Swift中使用AVFoundation录制视频。我已经制作了一个定制相机,但我只知道如何用它拍摄静态照片,却不知道如何录制视频。据我所知,您必须使用
avcapturedevideodataoutput
从录制中获取数据,但我不知道如何开始录制并实现委托方法

整个AVFoundation编程指南/静态和视频媒体捕获都是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()
}
在这里,我遇到了用户按record实际录制和捕获视频的问题:

@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
}

没有任何事情会像你想象的那样发生,因为我不知道如何正确地实现它。

我已经尝试了你的代码。当设置一个有意义的
文件路径
时,一切正常。像这样更改
文件路径
,将调用委托方法:

    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)

检查文件路径是否正确。它必须在现有目录中。但其他所有内容是否正确???我使用的文件目录有效?在委托方法中您想做什么?不太确定,可能只是告诉用户相机何时录制以及何时完成录制,然而,我甚至不知道如何录制,所以我从来没有真正获得过调用的委托方法。你知道我在哪里可以找到录制的视频,我无法在手机上的任何位置找到该目录,也无法使用codeIt在任何地方抓取它。它位于你应用程序的文档目录下。您可以参考查找它。还有一个问题,我在播放视频时遇到问题,因为当我尝试通过其URL播放视频时,recordingOutputURL不起作用。有什么建议吗?你能详细说明一下吗?你是怎么玩的?录制完视频后你会播放吗?我尝试了上面的代码,我的应用程序崩溃了。你介意分享工作代码@jimmy吗