現在のセットアップは次のとおりです ( 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
そしてheight
0 になる)
AVFoundation ドキュメントのドキュメントを読みましたが、重要なものが得られていないようです。