2

私のアプリでは、ビデオを録画しています。記録されたビデオの 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);
4

1 に答える 1

2

私は自分の問題を理解しました.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);
于 2013-06-17T17:46:01.080 に答える