如何从iOS中的CMSampleBufferRef获取当前捕获的Camera数据时间戳

时间:2015-03-27 08:23:35

标签: ios objective-c avfoundation cmsamplebufferref

我开发了iOS应用程序,它将捕获的摄像机数据保存到文件中并使用

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

捕获CMSampleBufferRef,这将编码为H264格式,帧将使用AVAssetWriter保存到文件中。

我按照示例源代码创建了这个应用程序:

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

打印值给我一个错误的时间戳,我需要获得帧的捕获时间。

有没有办法获取帧捕获的时间戳,

我已阅读以下链接以获取时间戳,但它没有正确阐述上述问题How to set timestamp of CMSampleBuffer for AVWriter writing

更新

我在写入文件之前读取了样本时间戳,它给了我一个xxxxx值(33333.23232)

我试图读取文件后它给了我不同的价值,这个具体原因是什么?

1 个答案:

答案 0 :(得分:2)

文件时间戳与捕获时间戳不同,因为它们相对于文件的开头。这意味着它们是您想要的捕获时间戳,减去捕获的第一帧的时间戳:

 presentationTimeStamp = fileFramePresentationTime + firstFrameCaptureTime

因此,从文件中读取时,应该计算所需的捕获时间戳:

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

如果您在启动应用之间进行此计算,则需要序列化和反序列化第一帧捕获时间,您可以使用CMTimeCopyAsDictionaryCMTimeMakeFromDictionary执行此操作。

您可以通过AVAssetWriter metadata属性将其存储在输出文件中。