Swift Swfit,AVFoundation开始记录isRecording何时为真

Swift Swfit,AVFoundation开始记录isRecording何时为真,swift,avfoundation,Swift,Avfoundation,我想录制一段长视频,在录制过程中将它分成几个部分,在不同的路径上持续几秒钟(如instagram故事) 我尝试停止录制并再次开始录制,但开发人员文档说,我有错误或丢失了部分视频(在停止录制和再次开始录制之间) 当他们想要停止记录新样本时,可以调用此方法 复制到当前文件,并且不希望继续录制到其他文件 文件如果要从一个文件切换到另一个文件,则不应 调用此方法。相反,你应该直接打电话 使用新文件URL开始记录(收件人:recordingDelegate:) 但是,当我第二次调用startRecordi

我想录制一段长视频,在录制过程中将它分成几个部分,在不同的路径上持续几秒钟(如instagram故事)

我尝试停止录制并再次开始录制,但开发人员文档说,我有错误或丢失了部分视频(在停止录制和再次开始录制之间)

当他们想要停止记录新样本时,可以调用此方法 复制到当前文件,并且不希望继续录制到其他文件 文件如果要从一个文件切换到另一个文件,则不应 调用此方法。相反,你应该直接打电话 使用新文件URL开始记录(收件人:recordingDelegate:)

但是,当我第二次调用startRecording()时(isRecording==true),委托调用了

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {}
错误是

错误域=AVFoundationErrorDomain代码=-11859“电影录制 无法启动“UserInfo={NSLocalizedDescription=电影录制” 无法启动,NSUnderlyingError=0x281efcc00{错误 域=NSOSStatusErrorDomain代码=-16419“(空)”}, nsLocalizedRecoverysSuggestion=停止正在录制的电影,然后 重试,.NSLocalizedFailureReason=电影录制已在播放中 进展}


我这样解决了我的问题

我做了一面旗子

var isRecordong: Bool = false
在我的启动操作中,在开始录制之后,我将标志更改为true并启动计时器

@IBAction func startRecording() {

    movieOutput.startRecording(to: outputURL, recordingDelegate: self)
    isRecording = true

    timer = Timer.scheduledTimer(withTimeInterval: duration, repeats: true, block: { [weak self] ( _ ) in

            guard let weakSelf = self else { return }

            if weakSelf.movieOutput.isRecording == true {
                weakSelf.movieOutput.stopRecording()
            }
        })
}
接下来,我实现了委托方法didfinishRecording,用于生成循环记录

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {

    if self.isRecording {
        movieOutput.startRecording(to: newOutputURL, recordingDelegate: self)
    } else {
        //perform action after recording
    }

}
在停止操作中,我停止录制,将标志更改为false并删除计时器

@IBAction func stopRecording() {
    isRecording = false
    if movieOutput.isRecording == true {
        movieOutput.stopRecording()
    } else {
        //perform action after recording, if action and timer will work simultaneously
    }
    timer.invalidate()
}
一些要点

  • 在开始和停止录制之间有一点延迟(即,此间隔未录制),但大约为0.1秒,这对我很合适
  • 第一个文件比文件的其余部分和持续时间短0.1–0.3秒,这是由于计时器造成的。此外,每个文件的持续时间将与计时器相差十分之几秒