10

デフォルトのパラメーターでビデオを撮影するプログラムがあり、カメラを動かすと露出、フォーカス、ホワイト バランスが自動的に調整されます。プログラムに LOCK と PRESET の 2 つのボタンを追加したいと考えています。LOCK ボタンを押すと、露出、フォーカス、ホワイトバランスが固定され、その値がユーザー設定として保存されます。PRESET ボタンは、ユーザー設定をカメラに設定し、すべてのビデオを同じ露出、フォーカス、ホワイト バランス値で撮影できるようにするためのものです。

ロック部分は簡単で、モードを変更するだけなので、露出、フォーカス、ホワイトバランスの値を取得して設定する方法があれば教えてください。

露出を例にとると、デフォルトでは、exposureMode は AVCaptureExposureModeContinuousAutoExposure に設定されています。つまり、iPhone を持ってビデオを撮影すると、明るい環境でも暗い環境でもシーンがはっきりと見えるように、露出が自動的に調整されます。

AVCaptureDevice* pCaptureDevice = [self videoDeviceWithPosition:AVCaptureDevicePositionBack];
[pCaptureDevice lockForConfiguration:nil];
[pCaptureDevice setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
[pCaptureDevice unlockForConfiguration];

LOCK ボタンが押されたら、exposureMode を AVCaptureExposureModeLocked に変更して、現在の露出値が変更されないようにします。

[pCaptureDevice lockForConfiguration:nil];
[pCaptureDevice setExposureMode:AVCaptureExposureModeLocked];
[pCaptureDevice unlockForConfiguration];

しかし、ボタンが押された瞬間の露出値を取得するにはどうすればよいでしょうか。さらに重要なことは、PRESET が押されたときに露出値を AVCaptureDevice に戻すにはどうすればよいかということです。

フォーラムを検索したところ、Michael Grinich の投稿: Accessing iOS 6 new APIs for camera Exposure and Shutter Speed のみが見つかりました。私は彼の発見に従い、プライベート API を使用して ExposureGain と ExposureDuration を取得および設定しようとしましたが、AVCaptureExposureModeContinuousAutoExposure モードでは、暗い環境から明るい環境にカメラを移動しても、これらの 2 つの値はまったく変わらないことがわかりました (exposureGain = 1.0 およびExposureDuration = {1, 30, 1, 0})。そして、それらを設定しても露出はまったく変わりませんでした。

[pCaptureDevice lockForConfiguration:nil];
[pCaptureDevice setExposureMode:AVCaptureExposureModeLocked];
[pCaptureDevice setManualExposureSupportEnabled:YES];
NSLog(@"exposure gain: %f", [pCaptureDevice exposureGain]);
[pCaptureDevice setExposureGain:3.0];
NSLog(@"exposure gain: %f", [pCaptureDevice exposureGain]);
[pCaptureDevice unlockForConfiguration];

誰でもこの問題を解決するのを手伝ってもらえますか? よろしくお願いします!

4

2 に答える 2

1

Accessing iOS 6 new APIs for Camera Exposure and Shutter Speedに役立つ回答を追加しました。ここにもう少し詳細を追加できます...

手動でフォーカスを設定する方法は、露出を設定するために概説したのとまったく同じ構造に従います。あれは:

#define AVCaptureFocusModeManual     3
NSError*    error = nil;
if ([captureDevice lockForConfiguration:&error]) {
    captureDevice.manualFocusSupportEnabled = YES;
    if ([captureDevice isFocusModeSupported:AVCaptureFocusModeManual]) {
        captureDevice.focusMode = AVCaptureFocusModeManual;
        // this is a value [0..1]
        captureDevice.focusPosition = ...;
    }
    [captureDevice unlockForConfiguration];
}

ホワイトバランスには、露出やフォーカスのように特別なモードはないようです。WhiteBalanceMode をロックに設定しないでください。それ以外の場合は、色温度を設定するだけでよいようです。

// this is also a value [0..1]
captureDevice.whiteBalanceTemperature = ...;
于 2014-01-30T08:24:40.933 に答える