Как получить текущую временную метку данных камеры из 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
.