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