Ios AVCaptureConnection isVideoMinFrameDurationSupported是否为false?

Ios AVCaptureConnection isVideoMinFrameDurationSupported是否为false?,ios,ipad,cocoa-touch,avcapturesession,frame-rate,Ios,Ipad,Cocoa Touch,Avcapturesession,Frame Rate,所以在我的应用程序中,我正在录制视频。我想将我录制的视频的fps限制为15 fps,因为速度再快,我就无法处理每一帧。该应用程序的目标是iOS 5.0+,因此我不必担心iOS的旧版本 我知道要设置最大fps,我可以使用AVCaptureConnection的setVideoMinFrameDuration。我还知道,为了让它真正工作,我还必须设置VideoMaxFrameDuration。然而,在我的iPad上,AVCaptureConnection的isVideoMinFrameDuratio

所以在我的应用程序中,我正在录制视频。我想将我录制的视频的fps限制为15 fps,因为速度再快,我就无法处理每一帧。该应用程序的目标是iOS 5.0+,因此我不必担心iOS的旧版本

我知道要设置最大fps,我可以使用AVCaptureConnection的setVideoMinFrameDuration。我还知道,为了让它真正工作,我还必须设置VideoMaxFrameDuration。然而,在我的iPad上,AVCaptureConnection的isVideoMinFrameDurationSupported总是返回false,因此我从未设置videoMinFrameDuration,最终不得不返回到设置AVCAptureVideoDataOutput的minFrameDuration(这是一个不推荐使用的调用,会导致警告等。有人能解释为什么我不能设置videoMinFrameDuration吗

代码:


我解决了我的问题。在尝试设置minFrameDuration(或者,就此而言,拉出AVCaptureConnection)之前,必须将输出添加到捕获会话中

因此,新代码如下所示:

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);
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);