2015-03-27 7 views
10

ho sviluppato e l'applicazione iOS che farà risparmiare catturato dati della videocamera in un file e ho usatoCome ottenere il timestamp corrente catturato dei dati della fotocamera da CMSampleBufferRef in iOS

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

per catturare CMSampleBufferRef e questo codificherà in nel formato H264 e i frame verranno salvati in un file usando AVAssetWriter.

Ho seguito il codice sorgente di esempio per creare questa app:

http://www.gdcl.co.uk//2013/02/20/iOS-Video-Encoding.html

Ora voglio ottenere timestamp dei frame video salvati per creare un nuovo file di film,

per questo che ho fatto le seguenti cose

1) individuare il file e di creare AVAssestReader leggere il file

CMSampleBufferRef sample = [asset_reader_output copyNextSampleBuffer]; 

     CMSampleBufferRef buffer; 
     while ([assestReader status]==AVAssetReaderStatusReading){ 
      buffer = [asset_reader_output copyNextSampleBuffer]; 

      //CMSampleBufferGetPresentationTimeStamp(buffer); 

      CMTime presentationTimeStamp = CMSampleBufferGetPresentationTimeStamp(buffer); 
      UInt32 timeStamp = (1000*presentationTimeStamp.value)/presentationTimeStamp.timescale; 

      NSLog(@"timestamp %u",(unsigned int)timeStamp); 


      NSLog(@"reading"); 
     // CFRelease(buffer); 

valore stampato mi dà un timestamp errato e ho bisogno di ottenere il tempo catturato del frame.

C'è un modo per ottenere fotogramma catturato timestamp,

Ho letto seguente Link per ottenerlo timestamp ma non elaborare correttamente la mia domanda di cui sopra How to set timestamp of CMSampleBuffer for AVWriter writing

aggiornamento

ho letto il time-stamp di esempio prima che scriva su un file, mi ha dato un valore xxxxx (33333.23232)

dopo aver provato a leggere il file mi ha dato un valore diverso, un motivo specifico per questo ??

+0

@ fireclaw48 ho trovato questo link, ma non dà una risposta adeguata, penso che questo sia per impostare un nuovo timestamp –

+0

Ho avuto lo stesso problema, hai ricevuto la risposta? –

risposta

2

I timestamp dei file sono diversi dai timestamp di acquisizione perché sono relativi all'inizio del file. Questo significa che sono i timestamp di acquisizione che si desidera, meno il timestamp del primo fotogramma catturato:

presentationTimeStamp = fileFramePresentationTime + firstFrameCaptureTime 

Così, quando la lettura dal file, questo dovrebbe calcolare il timestamp di acquisizione che si desidera:

CMTime firstCaptureFrameTimeStamp = // the first capture timestamp you see 
CMTime presentationTimeStamp = CMTimeAdd(CMSampleBufferGetPresentationTimeStamp(buffer), firstCaptureFrameTimeStamp); 

Se esegui questo calcolo tra i lanci della tua app, dovrai serializzare e deserializzare il primo tempo di acquisizione dei frame, cosa che puoi fare con CMTimeCopyAsDictionary e CMTimeMakeFromDictionary.

È possibile memorizzarlo nel file di output, tramite la proprietà AVAssetWritermetadata.

+0

grazie per la tua risposta controllerò questo, perché il timestamp di cattura non è uguale al timestamp effettivo, ho stampato questo valore, e non è lo stesso di nel web –

+1

buona domanda, non sono sicuro del motivo per cui i timestamp di acquisizione non sono " t relativo a quando inizi a catturare (perché _hey_ non parte da 0). –

+0

c'è comunque una connessione al timestamp di presentazione che riceve dal metodo delegato della telecamera al timestamp reale ?? devo usare una mappa per questo?ma questo sembra uno spreco di risorse –

Problemi correlati