我正在使用 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 帧持续时间?如何?
谢谢。