【问题标题】:AVCaptureSession and AVCaptureMovieFileOutput frame timestampAVCaptureSession 和 AVCaptureMovieFileOutput 帧时间戳
【发布时间】:2012-11-21 12:29:32
【问题描述】:

我正在使用 AVCaptureSession 和 AVCaptureMovieFileOutput 录制电影。我还在记录加速度数据并尝试将加速度数据与视频对齐。

我正在尝试找出一种方法来获取视频文件录制开始的时间。我正在执行以下操作:

currentDate = [NSDate date];
[output startRecordingToOutputFileURL:fileUrl recordingDelegate:self];

但是,根据我的测试,视频录制在调用 startRecordingToOutputFileURL 之前 0.12 秒开始。我假设这是因为各种视频缓冲区已经充满了添加到文件中的数据。

有没有办法获取视频第一帧的实际 NSDate?

【问题讨论】:

  • 你试过NSTimer吗?
  • 如果您设置了一个输出通道来捕获原始帧样本数据,您可以访问每个帧的时间戳。但是我无法使用电影输出和原始帧样本数据配置 AVCaptureSession,所以我不知道如何获取电影文件中第一个记录帧的确切时间戳。
  • 我只是给你一些提示,但我没有真正的答案。 AVFoundation 使用了很多 KVO 你确定没有“实时”改变属性吗?您是否尝试过打印电影文件的 AVItemMetadatas?
  • KVO 与播放器或录音机更改的确切时间相比有明显的时间延迟。它基本上就像实际组件的异步控件一样。我检查了 AVItemMetadata ,遗憾的是,这些值似乎被裁剪为精确到秒,而不是每个实例精确计时 30 fps 帧所需的 33 毫秒级别。

标签: ios ipad avcapturesession avcapturemoviefileoutput


【解决方案1】:

如果我正确回答了您的问题,您想知道记录第一帧的时间戳。你可以试试

CMTime captureStartTime = nil;

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

      if !captureStartTime{ 
         captureStartTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
      }
  // do the other things you want
 }

【讨论】:

  • 当我尝试这个时,我无法捕获电影文件输出。您是否有一个同时捕获样本缓冲区时间戳和电影文件的工作示例?
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 2011-04-27
  • 2019-06-22
  • 2012-01-21
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多