6

我在 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 帧的数字将相同,并且仅在达到一整秒时才会改变。

抓取帧时,如何以秒为单位获得带小数位的确切时间戳?谢谢。

4

1 回答 1

8

如果我将此数字除以时间刻度,则 25 帧的数字将相同,并且仅在达到一整秒时才会改变。

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

NSLog(@"%f", (float)timestamp.value / timestamp.timescale);
于 2012-11-10T13:47:22.137 回答