我开发和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
为此我做了以下事情
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)
之后,我试图读取文件,它给了我不同的价值,这个的任何具体原因?
解决方法
文件时间戳与捕获时间戳不同,因为它们相对于文件的开头.这意味着它们是您想要的捕获时间戳,减去捕获的第一帧的时间戳记:
presentationTimeStamp = fileFramePresentationTime + firstFrameCaptureTime
所以当从文件读取时,这应该计算你想要的捕获时间戳:
CMTime firstCaptureFrameTimeStamp = // the first capture timestamp you see CMTime presentationTimeStamp = CMTimeAdd(CMSampleBufferGetPresentationTimeStamp(buffer),firstCaptureFrameTimeStamp);
如果您在应用程序启动之间进行此计算,则需要对第一帧捕获时间进行序列化和反序列化,您可以使用CMTimecopyAsDictionary和CMTimeMakeFromDictionary进行操作.
原文地址:https://www.jb51.cc/iOS/330062.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。