ios - AVCaptureConnection isVideoMinFrameDurationSupported 为 false?

标签 ios ipad cocoa-touch avcapturesession frame-rate

所以在我的应用程序中,我正在录制视频。我想将录制视频的 fps 限制为 15 fps,因为如果速度太快,我在处理每一帧时都会遇到问题。该应用程序针对 iOS 5.0+,因此我不必担心较旧版本的 iOS。

我知道要设置最大 fps,我可以使用 AVCaptureConnection 的 setVideoMinFrameDuration。我还知道,要使其实际工作,我还必须设置VideoMaxFrameDuration。然而,在我的 iPad 上,AVCaptureConnection 的 isVideoMinFrameDurationSupported 似乎总是返回 false,因此我从未设置 videoMinFrameDuration,最终不得不回退到设置 AVCaptureVideoDataOutput 的 minFrameDuration (这是一个已弃用的调用,会导致警告等。谁能解释为什么我无法设置 videoMinFrameDuration?

代码:

AVCaptureVideoDataOutput *videoDataOut = [[AVCaptureVideoDataOutput alloc] init];
NSDictionary *settings = [[NSDictionary alloc]
                                        initWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange],
                                        (id)kCVPixelBufferPixelFormatTypeKey, nil];
videoDataOut.videoSettings = settings;

captureQueue = dispatch_queue_create("videoCaptureQueue", NULL);
    [videoDataOut setSampleBufferDelegate:self queue:captureQueue];
    videoDataOut.alwaysDiscardsLateVideoFrames = YES;
    AVCaptureConnection *conn = [videoDataOut connectionWithMediaType:AVMediaTypeVideo];

    // This if block is failing for some reason even though I'm running iOS 5.0+
    if ([conn isVideoMinFrameDurationSupported] && [conn isVideoMaxFrameDurationSupported]){
        [conn setVideoMinFrameDuration:CMTimeMake(1, pParams->fps)];
        [conn setVideoMaxFrameDuration:CMTimeMake(1, pParams->fps)];
    }
    else {
        videoDataOut.minFrameDuration = CMTimeMake(1, pParams->fps);
    }
    [captureSession addOutput:videoDataOut];

dispatch_release(captureQueue);

最佳答案

我解决了我的问题。您必须在尝试设置 minFrameDuration(或者拉出 AVCaptureConnection)之前将输出添加到捕获 session 。

因此,新代码如下所示:

AVCaptureVideoDataOutput *videoDataOut = [[AVCaptureVideoDataOutput alloc] init];
NSDictionary *settings = [[NSDictionary alloc]
                                        initWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange],
                                        (id)kCVPixelBufferPixelFormatTypeKey, nil];
videoDataOut.videoSettings = settings;

captureQueue = dispatch_queue_create("videoCaptureQueue", NULL);
[videoDataOut setSampleBufferDelegate:self queue:captureQueue];
videoDataOut.alwaysDiscardsLateVideoFrames = YES;
[captureSession addOutput:videoDataOut];

AVCaptureConnection *conn = [videoDataOut connectionWithMediaType:AVMediaTypeVideo];
if ([conn isVideoMinFrameDurationSupported] && [conn isVideoMaxFrameDurationSupported]){
        [conn setVideoMinFrameDuration:CMTimeMake(1, pParams->fps)];
        [conn setVideoMaxFrameDuration:CMTimeMake(1, pParams->fps)];
}

dispatch_release(captureQueue);

关于ios - AVCaptureConnection isVideoMinFrameDurationSupported 为 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17089860/

相关文章:

ios - 如何克服弃用?

ios - 这个月有多少个工作日

ios - 如何观察 NSMetadataItem 的 iCloud 更新?

ios - 哪种数据类型应该用于 iOS 中的长浮点值?

ios - 如何在应用程序本身内更新/下载应用程序

iphone - iOS - 尝试旋转文本标签并且标签消失

ios - 如何单击透明 UIView 后面的按钮?

iphone - 水平 UITableView

iphone - UITableView InsertRows (insertRowsAtIndexPaths) 仅对两个部分之一进行动画处理

iphone - NSMutableArray 在 reloadData 后变为 nil