2012-11-10 3 views
6

Ich bin innerhalb einer AVCaptureSession und ich muss die Nummer des Rahmens kennen, der erfasst wird.AVCaptureSession genaue Zeitstempel, wenn ein Rahmen gegriffen wird

Wenn die Erfassung beginnt, setze ich einen Bildnummerzähler auf Null zurück. Daher ist der Zeitstempel des ersten Rahmens Null. Nachfolgende Frames haben capture Zeitstempel wie dies zum Beispiel:

0 
0.033 
0.066 
0.099 
etc 

aber diese sind nicht genaue Zahlen, weil Frames verzichtet werden kann und geringe Unterschiede auftreten können. Ich muss den genauen Zeitpunkt wissen, zu dem ein Bild aufgenommen wurde. mit

Ich habe diese Methode, die jedes Mal, wenn ein Rahmen ...

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

innerhalb dieser Methode, die ich die cmtime eines Rahmens erhalten und an die Konsole aus:

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

aber das gibt mir wilde Zahlen wie

156317265588132 
156317307247388 
156317348909678 
156317390573453 
156317432230603 

den Unterschied zwischen einer num ber und die nächste ist etwa 41.659.256, die nicht eine Zeit in Sekunden mit Dezimalstellen darstellt, wenn der Rahmen gegriffen wird.

wenn ich teilen diese Zahlen durch den Zeitplan,

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

die Zahlen verwendet, wird das gleiche für 25 Frames sein und wird sich nur ändern, wenn eine volle Sekunde erreicht wird.

Wie erhalte ich den genauen Zeitstempel in Sekunden mit Dezimalstellen, wenn ein Rahmen gegriffen wird? Vielen Dank.

+0

Ich habe versucht, diese, den Wert zu erhalten, aber es gab mir einen falschen Wert nicht aktuellen Zeitstempel –

+1

CMTimeGetSeconds (Timestamp) – Sten

Antwort

8

Wenn ich diese Zahlen durch die Zeitskala dividiere, sind die Nummern für 25 Bilder gleich und ändern sich erst, wenn eine volle Sekunde erreicht ist.

Weil Integer-Division abgeschnitten. Wie wäre es

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

Ich habe versucht, diese, den Wert zu erhalten, aber es gab mir einen falschen Wert nicht aktuellen Zeitstempel –

Verwandte Themen