【问题标题】:Swfit, AVFoundation startRecording when isRecording is trueSwift,AVFoundation 在 Recording 为 true 时开始 Recording
【发布时间】:2019-10-07 09:19:27
【问题描述】:

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

我再次尝试 stopRecording 和 startRecording,但我有错误或丢失部分视频(再次在 stopRecording 和 startRecording 之间)开发人员文档说

当他们想停止录制新样本时,您可以调用此方法 到当前文件,不想继续录制到另一个文件 文件。如果你想从一个文件切换到另一个文件,你不应该 调用这个方法。相反,您应该简单地调用 startRecording(to:recordingDelegate:) 使用新的文件 URL。

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

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

错误是

Error Domain=AVFoundationErrorDomain Code=-11859 "电影录制 无法启动" UserInfo={NSLocalizedDescription=电影录制 无法启动,NSUnderlyingError=0x281efcc00 {Error 域=NSOSStatusErrorDomain 代码=-16419 "(null)"}, NSLocalizedRecoverySuggestion=停止正在进行的电影录制并 再试一次。, NSLocalizedFailureReason=电影录制已经在 进展。}

【问题讨论】:

    标签: swift avfoundation


    【解决方案1】:

    我这样解决了我的问题

    我做了一面旗帜

    var isRecordong: Bool = false
    

    在我的开始动作中,开始录制后,我将 flag 更改为 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()
                }
            })
    }
    

    接下来我实现委托方法 didFinishRecordingTo 进行循环录制

    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 秒,这是由于计时器。此外,每个文件的持续时间将与计时器相差十分之几秒

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多