【发布时间】:2013-03-20 15:28:08
【问题描述】:
我正在使用 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 帧持续时间?怎么样?
谢谢。
【问题讨论】:
标签: ios objective-c cocoa-touch avfoundation