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

12

我开发了一款iOS应用程序,可以将捕获的相机数据保存到文件中,并且我使用了

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

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

我按照示例源代码创建了此应用:

现在我想获取保存的视频帧的时间戳以创建新的电影文件。 为此,我已经完成了以下工作:

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

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

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

我读了一个答案来获取它的时间戳但是它并没有很好地说明我的问题。上面的链接在这里an answer

更新:

在将样本写入文件之前,我读取了样本时间戳,它给了我一个 xxxxx 的值 (33333.23232)。 但是尝试读取文件后却得到了不同的值。 这是什么原因?


@fireclaw48 我找到了这个链接,但它没有给出一个合适的答案。我认为这是用来设置新的时间戳的。 - Mr.G
我遇到了同样的问题,你找到答案了吗? - Pavlo Boiko
1个回答

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

因此,在从文件中读取时,应计算您想要的捕获时间戳:

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

如果你在应用程序启动之间进行此计算,你需要对第一帧捕获时间进行序列化和反序列化,可以使用CMTimeCopyAsDictionaryCMTimeMakeFromDictionary来实现。你可以通过AVAssetWritermetadata属性将其存储在输出文件中。

谢谢您的回答,我会检查一下。为什么捕获时间戳不等于实际时间戳?我已经打印了这个值,它与网页上的不同。 - Mr.G
1
好问题,我不确定为什么捕获时间戳与您开始捕获的时间无关(为什么它们不从0开始)。 - Rhythmic Fistman
有没有办法将从相机委托方法接收到的演示时间戳连接到实际时间戳?我需要使用地图吗?但这似乎会浪费资源。 - Mr.G
在我的情况下,我必须为整个电影创建一个单独的剪辑,并且我必须从后端服务器同步时间戳,为此,我需要将演示时间戳与实际时间戳连接起来,我将尝试使用元数据来实现这一点。 - Mr.G
时间戳是相对于全局系统主机时间基准的。这使得可以将使用其他API捕获的媒体进行同步。 - Rhythmic Fistman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接