Как получить текущую временную метку данных камеры из CMSampleBufferRef в iOS

Я разработал приложение iOS, которое сохранит записанные данные камеры в файл, и я использовал

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

для захвата CMSampleBufferRef, и он будет кодироваться в формате H264, а кадры будут сохранены в файл с помощью AVAssetWriter.

i последовал за исходным кодом образца, чтобы создать это приложение:

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

Теперь я хочу получить временную метку сохраненных видеокадров для создания нового видеофайла,

для этого я сделал следующие вещи

1) найдите файл и создайте AVAssestReader для чтения файла

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);

напечатанное значение дает мне неправильную метку времени, и мне нужно получить отснятое время кадра.

Есть ли способ получить метку времени захвата кадра,

Я прочитал следующую ссылку, чтобы получить ее timestamp, но она не уточняет мой вопрос выше Как установить метку времени CMSampleBuffer для записи в формате AVWriter

update

Я прочитал образец времени перед его записью в файл, он дал мне значение xxxxx (33333.23232)

после того, как я попытался прочитать файл, он дал мне другое значение, любая конкретная причина для этого?

Ответ 1

Временные метки файла отличаются от временных меток захвата, поскольку они относятся к началу файла. Это означает, что это временные метки захвата, которые вы хотите, минус отметка времени самого первого кадра:

 presentationTimeStamp = fileFramePresentationTime + firstFrameCaptureTime

Таким образом, при чтении из файла, это должно рассчитывать временную метку захвата, которую вы хотите:

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

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

Вы можете сохранить это в выходном файле с помощью свойства AVAssetWriter metadata.