2012-11-10 4 views
6

Sono all'interno di una AVCaptureSession e ho bisogno di conoscere il numero del frame che viene catturato.Data/ora esatta di AVCaptureSession quando viene afferrato un frame

All'avvio, il reset del contatore del numero di fotogramma viene azzerato. Quindi, il timestamp del primo frame sarà zero. fotogrammi successivi avranno timestamp di cattura in questo modo, per esempio:

0 
0.033 
0.066 
0.099 
etc 

ma questi non sono numeri esatti, perché i frame possono essere eliminate e lievi differenze possono accadere. Devo sapere l'ora esatta in cui è stato catturato un fotogramma.

ho questo metodo che viene chiamato ogni volta che un frame viene afferrato ...

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

all'interno di questo metodo posso ottenere il CMTime di un telaio e stamparlo utilizzando la console:

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

ma questo mi darà i numeri selvatici come

156317265588132 
156317307247388 
156317348909678 
156317390573453 
156317432230603 

la differenza tra un num ber e il prossimo è circa 41.659.256 che non sembra rappresentare un tempo in secondi con cifre decimali quando il frame viene afferrato.

se dividere questo numero per la scala temporale, utilizzando

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

numeri sarà lo stesso per 25 fotogrammi e cambierà solamente quando viene raggiunto un secondo intero.

Come ottengo l'ora esatta in secondi con cifre decimali quando viene afferrato un fotogramma? Grazie.

+0

ho cercato di ottenere questo, il valore, ma mi ha dato un valore sbagliato non timestamp corrente –

+1

CMTimeGetSeconds (timestamp) – Sten

risposta

8

Se suddivido questi numeri in base alla scala cronologica, i numeri saranno gli stessi per 25 fotogrammi e cambieranno solo quando viene raggiunto un secondo completo.

Perché la divisione dei numeri interi viene troncata. Che ne dite di

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

ho cercato di ottenere questo, il valore, ma mi ha dato un valore sbagliato non timestamp corrente –