5

AVCaptureSession で毎秒 5 枚の写真を撮ろうとしていますが、AVFrameRange の意味がよくわかりません。現在、デバイスをセットアップするコードがいくつかあります。

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

activeVideoMinFrameDurationactiveVideoMaxFrameDurationを のカスタム値に設定しようとしますCMTimeMake(1, 5)。Apple は、提供された AVFrameRanges の 1 つしか使用できないと言っています。

それらを NSLogged すると、(2, 30)、(2,60)、および (2,24) が得られます。まず知りたいのはこれが何を意味するのか?これは、カメラが実行されるフレームレートですか、それともフレームをキャプチャする間隔ですか (つまり、私がやろうとしていること)?

そうでない場合、sampleBufferDelegate メソッドで毎秒 5 フレームを保存するにはどうすればよいですか? 現在、フレームがあるたびにメソッドが呼び出されるため、すべてのフレームが得られます。そのため、毎秒 5 つだけを取得する方法についてのポインターが必要です。

4

2 に答える 2

2

カスタム フレーム レートを選択するためのコードは次のとおりです。Apple RosyWriterにチェックを追加して、現在のフォーマットが選択した FPS をサポートしているかどうかを確認します。

- (void)configureCamera:(AVCaptureDevice *)videoDevice withFrameRate:(int)desiredFrameRate
{
    BOOL isFPSSupported = NO;
    AVCaptureDeviceFormat *currentFormat = [videoDevice activeFormat];
    for ( AVFrameRateRange *range in currentFormat.videoSupportedFrameRateRanges ) {
        if ( range.maxFrameRate >= desiredFrameRate && range.minFrameRate <= desiredFrameRate )        {
            isFPSSupported = YES;
            break;
        }
    }

    if( isFPSSupported ) {
        if ( [videoDevice lockForConfiguration:NULL] ) {
            videoDevice.activeVideoMaxFrameDuration = CMTimeMake( 1, desiredFrameRate );
            videoDevice.activeVideoMinFrameDuration = CMTimeMake( 1, desiredFrameRate );
            [videoDevice unlockForConfiguration];
        }
    }
}

現在のフォーマット ( activeFormat) が選択した FPS をサポートしていない場合は、以下のコードを使用して変更activeFormatし、FPS を選択してください。ただし、ニーズに合わせてフォーマット ディメンションを取得する必要があります。

- (void)configureCamera:(AVCaptureDevice *)device withFrameRate:(int)desiredFrameRate
{
    AVCaptureDeviceFormat *desiredFormat = nil;
    for ( AVCaptureDeviceFormat *format in [device formats] ) {
        for ( AVFrameRateRange *range in format.videoSupportedFrameRateRanges ) {
            if ( range.maxFrameRate >= desiredFrameRate && range.minFrameRate <= desiredFrameRate ) {
                desiredFormat = format;
                goto desiredFormatFound;
            }
        }
    }

    desiredFormatFound:
    if ( desiredFormat ) {
        if ( [device lockForConfiguration:NULL] == YES ) {
            device.activeFormat = desiredFormat ;
            device.activeVideoMinFrameDuration = CMTimeMake ( 1, desiredFrameRate );
            device.activeVideoMaxFrameDuration = CMTimeMake ( 1, desiredFrameRate );
            [device unlockForConfiguration];
        }
    }
}

注: を使用しAVCaptureConnection videoMinFrameDurationて FPS を設定することは非推奨です。

于 2014-12-19T13:01:22.797 に答える