AVCaptureSession抓取帧时的准确时间戳

时间:2012-11-10 13:42:58

标签: iphone ios ipad avcapturesession

我在AVCaptureSession中,我需要知道正在捕获的帧数。

捕捉开始时,我会将帧数计数器重置为零。因此,第一帧的时间戳将为零。后续帧将具有这样的捕获时间戳,例如:

0
0.033
0.066
0.099
etc

但这些不是确切的数字,因为可以删除帧并且可能发生轻微差异。我需要知道捕获帧的确切时间。

每次抓取一个帧时都会调用此方法...

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 

在此方法中,我可以获取帧的CMTime并使用以下命令将其打印到控制台:

CMTime timestamp = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
NSLog(@"%lld", timestamp.value);

但这会给我一些像

这样的狂野数字
156317265588132
156317307247388
156317348909678
156317390573453
156317432230603

一个数字和下一个数字之间的差异大约是41,659,256,它似乎不代表抓取帧时带小数位的秒数。

如果我将这个数字除以时间刻度,使用

NSLog(@"%lld", timestamp.value/timestamp.timescale);

25帧的数字相同,只有在达到一整秒时才会改变。

抓取框架时,如何获取带小数位的精确时间戳(以秒为单位)?感谢。

1 个答案:

答案 0 :(得分:8)

  

如果我将这个数字除以时间刻度,那么25帧的数字将是相同的,并且只有在达到一整秒时才会改变。

因为整数除法截断。 <怎么样

NSLog(@"%f", (float)timestamp.value / timestamp.timescale);