AVCaptureMovieFileOutput - 录制连续视频剪辑

时间:2015-09-26 23:56:01

标签: ios swift avfoundation

我想在一系列流畅的可变长度剪辑中录制视频/音频。也就是说,vid1.mp4后跟vid2.mp4应无缝连接,或者大部分无缝连接。

我目前的问题是,我似乎无法立即切换文件而不会出错。

问题的症结在于:

func recordNewClip() {
    let file = self.outputUrl()
    let filePath = file!.path!
    try? NSFileManager.defaultManager().removeItemAtPath(filePath)
    movieOutput!.stopRecording()
    movieOutput!.startRecordingToOutputFileURL(file, recordingDelegate: self)
}

如果我不打电话给stopRecording,我会收到错误,如果我打电话给stopRecording,则只会记录随机视频片段;大多数录音失败。

如何使用AVFoundation捕获连续视频片段?

1 个答案:

答案 0 :(得分:0)

我们去! 所以,这是一个很多人都没有处理的话题,所以让我给你一些帮助。

录制时,您有会话和输出

如果您阅读了委托方法的Apple文档,您将看到

    startRecordingToOutputFileURL

那仍然会解雇

    didFinishRecordingToOutputFileAtURL

问题是您需要更新输出并在会话中添加/删除它。

因此对于swift - >

    ....
    // Remove old output
    session.removeOutput(output);
    // Create new output
    output = AVCaptureMovieFileOutput()
    if session.canAddOutput(output) {
        session.addOutput(output)
        output.startRecordingToOutputFileURL(fileDest, recordingDelegate: self.delegate)
    }  
    .... 

这将触发委托方法(DELEGATE METHOD !!!)

    func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
    let outputPath = outputFileURL.path!
    do {
        print(outputPath);
        try NSFileManager.defaultManager().removeItemAtPath(outputPath)
    } catch _ {
        print("error removing file");

    }
    do {
        try NSFileManager.defaultManager().moveItemAtPath(outputFileURL.path!, toPath: outputPath)
    } catch _ {
    print(error);
    }
}

这个想法是你必须这样做,因为如果你停止录制,你需要创建一个新的会话,然后创建一个新的输出。这样您只需要创建一个新输出。

如果需要任何编辑或调整,请告诉我,但它对我有用。