从AVCaptureVideoDataOutput - AVFoundation获取正确的第一帧

时间:2016-03-24 05:04:11

标签: ios avfoundation

我正在使用AVFoundation从后置摄像头捕捉视频,并希望在按下开始按钮时处理帧。问题是,当我按下开始按钮的那一刻,我从样本缓冲区中抓取帧并处理它,但似乎我得到的帧是过去的帧,这意味着不是我想要的当前帧。

我知道样本缓冲区会在延迟时间到来。我尝试使用示例缓冲区的演示时间戳,但我似乎无法使其同步。以前有人遇到过类似的问题吗?任何帮助或建议将不胜感激。

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

这就是我的框架。

1 个答案:

答案 0 :(得分:-1)

我设法找到一个解决方案,以防其他人遇到同样的问题。

根据我的理解,Apple不保证您按下捕获按钮的那一刻就会获得该帧,因为它们在您设置的串行队列缓冲区中排队。你肯定会按顺序得到它,但不是实时的。为了在按下按钮之前忽略过去的帧,我使用NSDate来测量开始运行捕获会话所花费的时间(startTime)以及在捕获输出委托中处理第一帧的时间(endTime)

所以,花费的时间= endTime-startTime

有了这个时间,我们可以计算帧延迟,在我的情况下,我捕获24FPS并且帧延迟是3帧,所以当用户按下捕获按钮时,我将不会存储/处理前3帧这样结果可以与用户捕获的内容保持同步。

希望有帮助,随时提供更好的建议和编辑。