AVCaptureVideoDataOutput

AVCaptureVideoDataOutput

当查看GLCameraRipple示例时,以这样一种方式设置AVCaptureVideoDataOutput:无论何时从iPhone摄像头收到新帧,都会调用回调(captureOutput)。

但是,将“sleep(1)”放在“drawInRect”函数(用于OpenGL绘图)的开头,该回调每秒仅被调用1次,而不是每秒30次。

谁能告诉我为什么iPhone相机的帧速率与OpenGL绘图调用的帧速率相关联?

更新:重现步骤

  • 从此处下载GLCameraRipple示例:http://developer.apple.com/library/ios/#samplecode/GLCameraRipple/Introduction/Intro.html
  • 在RippleViewController.m => captureOutput中,添加一个NSLog(@"Got Frame");。运行它会生成很多“Got Frame”消息(大约每秒30条消息)
  • 在RippleViewController.m => drawInRect中,在函数的开头添加sleep(1);。现在每秒仅显示一条消息。
  • 最佳答案

    当AVCaptureVideoDataOutput调用委托方法captureOutput:didOutputSampleBuffer:fromConnection:来使程序员能够编辑或记录来自摄像机的图像时,此方法从主线程调用。并且,通常我们应该编写直接通过主线程与用户界面交互的代码,以及为什么OpenGL之所以喜欢AVCaptureVideoDataOutput,因为从摄像头到绘制到屏幕的方法都在主线程中运行。

    如果iPhone无法处理captureOutput:didOutputSampleBuffer:fromConnection:如处理时间超过1/30秒的下一帧的时间结束,则AVCaptureVideoDataOutput类和AVCaptureVideoDataOutput类可以删除图像,将忽略您可以使用captureOutput:didDropSampleBuffer:fromConnection:方法收集数据

    09-07 14:10