Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在录制时获取AVCaptureMovieFileOutput的当前长度以显示在屏幕上?_Swift_Video_Time_Avfoundation_Recording - Fatal编程技术网

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

Swift 如何在录制时获取AVCaptureMovieFileOutput的当前长度以显示在屏幕上?,swift,video,time,avfoundation,recording,Swift,Video,Time,Avfoundation,Recording,正如标题所说,我希望在用户使用AVFoundation录制视频时显示当前的录制长度。我在AVAudioRecorder上做了类似的事情,我创建了一个计时器,用于设置标签的文本,如下所示: recordDurationLabel.text=timeString((audioRecorder?.currentTime)!) 我想知道是否有“当前时间”功能用于录制视频?我唯一的另一个想法是在captureOutput中启动一个重复的1秒计时器:DidStartRecordingToOutputFile

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

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

我想知道是否有“当前时间”功能用于录制视频?我唯一的另一个想法是在captureOutput中启动一个重复的1秒计时器:DidStartRecordingToOutputFileAttribute函数,但我想确保准确性

提前谢谢

编辑: 现在,这是我在captureOutput中实现的函数:didStartRecordingToOutputFileAttural委托方法,但同样,如果有与视频直接相关的内容,会更干净

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
获取电影的持续时间,它是只读的,并在开始录制时返回CMTime。看

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

执行类似于
CMTimeSubstract
的CMTime操作将允许您计算当前缓冲区与记录的第一个缓冲区之间的时间差


如果您从未操作过sampleBuffers,那么您应该看看Apple提供的示例代码:

使用
AVCaptureMovieFileOutput
,您可以使用
recordedDuration
获取电影的持续时间,它是只读的,并在开始录制时返回CMTime。看

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

执行类似于
CMTimeSubstract
的CMTime操作将允许您计算当前缓冲区与记录的第一个缓冲区之间的时间差


如果您从未操作过sampleBuffers,那么您应该看看Apple的以下示例代码:

谢谢,我希望避免使用AVCaptureVideoDataOutput,但似乎这将是一种方法。糟糕的是,我很少使用MovieFileOutput。我查看了文档,只需保留对输出的引用,并使用
recordedDuration
访问持续时间。编辑答案谢谢,我希望避免使用AVCaptureVideoDataOutput,但似乎这就是当时的做法。我的缺点是,我很少使用MovieFileOutput。我查看了文档,只需保留对输出的引用,并使用
recordedDuration
访问持续时间。编辑了答案