如何在Swift中录制带有avfoundation的视频?

Gar*_*aye 21 video-capture avfoundation ios swift

我想弄清楚如何在Swift中使用AVFoundation录制视频.我已经创建了一个自定义相机,但我只知道如何拍摄静态照片,我无法弄清楚如何录制视频.根据我的理解,您必须使用AVCaptureVideoDataOutput从录制中获取数据,但我无法弄清楚如何开始录制并实现委托方法.

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

}
Run Code Online (Sandbox Code Playgroud)

然后一旦调用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()
}
Run Code Online (Sandbox Code Playgroud)

在这里,我被困在用户按下记录以实际记录和捕获视频的位置:

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

}
Run Code Online (Sandbox Code Playgroud)

然后我打电话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
}
Run Code Online (Sandbox Code Playgroud)

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

liu*_*ong 15

我试过你的代码.设置有意义时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)
Run Code Online (Sandbox Code Playgroud)