Точная отметка времени 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 кадров и изменятся только по достижении полной секунды.

Как получить точную отметку времени в секундах с десятичными разрядами при захвате кадра? благодаря.


person Duck    schedule 10.11.2012    source источник
comment
я пытался получить это значение, но оно дало мне неправильное значение, а не текущую отметку времени   -  person Mr.G    schedule 26.03.2015
comment
CMTimeGetSeconds (отметка времени)   -  person Sten    schedule 07.04.2015


Ответы (1)


Если я разделю эти числа на шкалу времени, числа будут одинаковыми для 25 кадров и изменятся только по достижении полной секунды.

Потому что целочисленное деление усекает. Как насчет

NSLog(@"%f", (float)timestamp.value / timestamp.timescale);
person Community    schedule 10.11.2012
comment
я пытался получить это значение, но оно дало мне неправильное значение, а не текущую отметку времени - person Mr.G; 26.03.2015