2012-11-10 9 views
6

Jestem w trakcie sesji AVCaptureSession i potrzebuję znać numer przechwyconej ramki.Dokładny datownik AVCaptureSession po chwyceniu ramki

Po rozpoczęciu przechwytywania zresetuję licznik numerów klatek na zero. Zatem znacznik czasu pierwszej klatki będzie wynosił zero. Kolejne ramki będą miały znaczniki czasu przechwytywania tak, na przykład:

0 
0.033 
0.066 
0.099 
etc 

ale nie są to dokładne liczby, ponieważ ramki mogą zostać usunięte i niewielkie różnice mogą się zdarzyć. Muszę znać dokładny czas przechwycenia ramki.

mam to metoda, która jest wywoływana za każdym razem, gdy ramka jest złapał ...

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

wewnątrz tej metody można uzyskać CMTime z ramy i wydrukować go do konsoli za pomocą:

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

ale to da mi dzikie numery jak

156317265588132 
156317307247388 
156317348909678 
156317390573453 
156317432230603 

różnica między jednym num ber i następny to około 41.659.256, który nie wydaje się reprezentować czasu w sekundach z miejscami po przecinku, gdy ramka jest chwytana.

jeśli podzielenie tej liczby przez czasowych używając

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

numery będą takie same dla 25 ramek i zmiany tylko po osiągnięciu pełnej sekundy.

Jak uzyskać dokładny datownik w sekundach z miejscami dziesiętnymi po chwyceniu ramki? dzięki.

+0

próbowałem dostać ten, wartość, ale dał mi złą wartość nie aktualny timestamp –

+1

CMTimeGetSeconds (timestamp) – Sten

Odpowiedz

8

Jeśli podzielę te liczby według skali czasowej, liczby będą takie same dla 25 ramek i będą się zmieniać dopiero po osiągnięciu pełnej sekundy.

Ponieważ podział całkowity zostaje obcięty. Jak o

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

Próbowałem dostać ten, wartość, ale dał mi złą wartość nie aktualny timestamp –