8

現在のセットアップは次のとおりです ( Brad Larsonの ColorTrackingCamera プロジェクトに基づく):

出力をテクスチャとして OpenGL シーンに通すためのAVCaptureSessionセットを使用しています。AVCaptureSessionPreset640x480このテクスチャは、フラグメント シェーダーによって操作されます。

ユーザーがプレビューしているときに高いフレームレートを維持したいので、この「低品質」のプリセットが必要です。次に、ユーザーが静止写真をキャプチャするときに、より高品質の出力に切り替えたいと考えています。

最初はオンザオンを変更できると思っていsessionPresetましたAVCaptureSessionが、これによりカメラが再フォーカスされ、使いやすさが損なわれます。

[captureSession beginConfiguration];
captureSession.sessionPreset = AVCaptureSessionPresetPhoto;
[captureSession commitConfiguration];

AVCaptureStillImageOutput現在、AVCaptureSession に1 秒追加しようとしていますが、空のピクセルバッファを取得しているため、ちょっと行き詰まっていると思います。

これが私のセッション設定コードです:

...

// Add the video frame output
[captureSession beginConfiguration];

videoOutput = [[AVCaptureVideoDataOutput alloc] init];
[videoOutput setAlwaysDiscardsLateVideoFrames:YES];
[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

if ([captureSession canAddOutput:videoOutput])
{
    [captureSession addOutput:videoOutput];
}
else
{
    NSLog(@"Couldn't add video output");
}

[captureSession commitConfiguration];



// Add still output
[captureSession beginConfiguration];
stillOutput = [[AVCaptureStillImageOutput alloc] init];

if([captureSession canAddOutput:stillOutput])
{
    [captureSession addOutput:stillOutput];
}
else
{
    NSLog(@"Couldn't add still output");
}

[captureSession commitConfiguration];



// Start capturing
[captureSession setSessionPreset:AVCaptureSessionPreset640x480];
if(![captureSession isRunning])
{
    [captureSession startRunning];
};

...

そして、ここに私のキャプチャ方法があります:

- (void)prepareForHighResolutionOutput
{
    AVCaptureConnection *videoConnection = nil;
    for (AVCaptureConnection *connection in stillOutput.connections) {
        for (AVCaptureInputPort *port in [connection inputPorts]) {
            if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {
                videoConnection = connection;
                break;
            }
        }
        if (videoConnection) { break; }
    }

    [stillOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:
     ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
         CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(imageSampleBuffer);
         CVPixelBufferLockBaseAddress(pixelBuffer, 0);
         int width = CVPixelBufferGetWidth(pixelBuffer);
         int height = CVPixelBufferGetHeight(pixelBuffer);

         NSLog(@"%i x %i", width, height);
         CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
     }];
}

(widthそしてheight0 になる)

AVFoundation ドキュメントのドキュメントを読みましたが、重要なものが得られていないようです。

4

1 に答える 1

3

特定の問題の解決策を見つけました。誰かが同じ問題に遭遇した場合のガイドとして使用できることを願っています.

フレームレートが大幅に低下した理由は、ピクセル フォーマット間の内部変換に関係していました。ピクセルフォーマットを明示的に設定した後、フレームレートが増加しました。

私の状況では、次の方法で BGRA テクスチャを作成していました。

// Let Core Video create the OpenGL texture from pixelbuffer
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, videoTextureCache, pixelBuffer, NULL,
                                                            GL_TEXTURE_2D, GL_RGBA, width, height, GL_BGRA,
                                                            GL_UNSIGNED_BYTE, 0, &videoTexture);

したがって、インスタンスをセットアップするときにAVCaptureStillImageOutput、コードを次のように変更しました。

// Add still output
stillOutput = [[AVCaptureStillImageOutput alloc] init];
[stillOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];

if([captureSession canAddOutput:stillOutput])
{
    [captureSession addOutput:stillOutput];
}
else
{
    NSLog(@"Couldn't add still output");
}

これがいつか誰かに役立つことを願っています;)

于 2012-08-21T16:13:58.267 に答える