录制时如何获取 AVCaptureMovieFileOutput 的当前长度以显示在屏幕上?

How to get current length of AVCaptureMovieFileOutput while recording to display on screen?

如标​​题所述,我希望在用户使用 AVFoundation 录制视频时显示当前录制的长度。我用 AVAudioRecorder 做了类似的事情,我创建了一个计时器来设置标签的文本,如下所示:

recordDurationLabel.text = timeString((audioRecorder?.currentTime)!)

我想知道是否有 "currentTime" 录制视频的功能?我唯一的另一个想法是在 captureOutput:didStartRecordingToOutputFileAtURL 函数中启动一个重复的 1 秒计时器,但我想确保准确性。

提前致谢!

编辑: 目前,这是我在 captureOutput:didStartRecordingToOutputFileAtURL 委托方法中实现的功能,但同样,如果有一些与视频直接相关的内容会更清晰。

func startRecordingUpdateTimer() {

    recordingUpdateTimer = NSTimer(timeInterval: 1.0/45.0, target: self, selector: #selector(recordedVideo), userInfo: nil, repeats: true)
    NSRunLoop.mainRunLoop().addTimer(recordingUpdateTimer!, forMode: NSRunLoopCommonModes)
}

func recordedVideo() {
    durationTime = durationTime + 1.0/45.0
    let durationString = timeString(durationTime)
    recordDurationLabel.text =  durationString
}

使用 AVCaptureMovieFileOutput,您可以使用 recordedDuration 获取电影的持续时间,它是只读的,并且会 return 在录制开始时为您提供 CMTime。参见 AVCaptureFileOutput

如果您使用 captureOutput:didOutputSampleBuffer:fromConnection:,您将收到 CMSampleBuffer 对象,其中包含您可以使用 CMSampleBufferGetPresentationTimeStamp 访问的 CMTime

CMTimeSubstract 那样进行 CMTime 操作将允许您计算当前缓冲区与您记录的第一个缓冲区之间的时间差。

如果您从未操作过 sampleBuffers,您应该看看来自 Apple 的示例代码:RosyWriter