我正在使用AVFoundation从后置摄像头捕捉视频,并希望在按下开始按钮时处理帧。问题是,当我按下开始按钮的那一刻,我从样本缓冲区中抓取帧并处理它,但似乎我得到的帧是过去的帧,这意味着不是我想要的当前帧。
我知道样本缓冲区会在延迟时间到来。我尝试使用示例缓冲区的演示时间戳,但我似乎无法使其同步。以前有人遇到过类似的问题吗?任何帮助或建议将不胜感激。
(void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection;
这就是我的框架。
答案 0 :(得分:-1)
我设法找到一个解决方案,以防其他人遇到同样的问题。
根据我的理解,Apple不保证您按下捕获按钮的那一刻就会获得该帧,因为它们在您设置的串行队列缓冲区中排队。你肯定会按顺序得到它,但不是实时的。为了在按下按钮之前忽略过去的帧,我使用NSDate来测量开始运行捕获会话所花费的时间(startTime)以及在捕获输出委托中处理第一帧的时间(endTime)
所以,花费的时间= endTime-startTime
有了这个时间,我们可以计算帧延迟,在我的情况下,我捕获24FPS并且帧延迟是3帧,所以当用户按下捕获按钮时,我将不会存储/处理前3帧这样结果可以与用户捕获的内容保持同步。
希望有帮助,随时提供更好的建议和编辑。