我正在使用AV Foundation处理视频摄像头的帧(iPhone 4s,iOS 6.1.2)。我正在按照AV Foundation编程指南设置AVCaptureSession、AVCaptureDeviceInput和AVCaptureVideoDataOutput。一切都符合预期,我能够在
我还设置了一个预览层,如下所示:
captureOutput:didOutputSampleBuffer:fromConnection:
委托中接收到帧。我还设置了一个预览层,如下所示:
AVCaptureVideoPreviewLayer *videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
[videoPreviewLayer setFrame:self.view.bounds];
videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer insertSublayer:videoPreviewLayer atIndex:0];
事实上,在我的画面处理中我并不需要每秒30帧,而且我也无法以如此快的速度进行处理。因此我使用下面的代码来限制帧率:
// videoOutput is AVCaptureVideoDataOutput set earlier
AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo];
[conn setVideoMinFrameDuration:CMTimeMake(1, 10)];
[conn setVideoMaxFrameDuration:CMTimeMake(1, 2)];
这样做可以很好地限制由captureOutput委托接收的帧。
然而,这也会限制预览图层每秒的帧数,导致预览视频非常不响应。
从文档中了解到,帧持续时间是在连接上独立设置的,预览图层确实有一个不同的AVCaptureConnection。检查[videoPreviewLayer connection]
上的最小/最大帧持续时间表明,它确实设置为默认值(1/30和1/24),并且与AVCaptureVideoDataOutput的连接上设置的持续时间不同。
那么,是否可能仅在帧捕获输出上限制帧持续时间,并仍然看到预览视频的1/24-1/30帧持续时间?如何实现?
谢谢。