私がコーディングしている Mac OS X アプリは、macbook 内蔵の facetime カメラを使用して写真をキャプチャしています。
MacBookAir3,2、MacBookPro8,2、および MacBookPro10,2 では正常に動作しますが、新しい MacBook では「暗い」写真が撮影されます。自動露出が原因であることは理解していますが、機能させるのに苦労しています。にAVCaptureDevice
adjustingExposure
設定されてNO
いますが、キャプチャされた写真はまだ完全に暗いです。
コード:setupCamera
アプリの起動中に 1 回呼び出されます
-(void) setupCamera
{
session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetPhoto;
sessionInitialized = YES;
device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[device lockForConfiguration:NULL];
if ([device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure])
[device setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
if ([device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus])
[device setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
if ([device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance])
[device setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance];
[device unlockForConfiguration];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if(error != nil) {
// ...
}
if([session canAddInput:input]) {
[session addInput:input];
} else {
// ...
}
output = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = @{ AVVideoCodecKey : AVVideoCodecJPEG };
[output setOutputSettings:outputSettings];
if([session canAddOutput:output]) {
[session addOutput:output];
} else {
// ...
}
}
...その後、UI のスナップ ボタンをクリックするたびにshootPhoto
関数が呼び出されます。
-(void) shootPhoto
{
[session startRunning];
if([device lockForConfiguration:NULL]) {
if ([device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure])
[device setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
if ([device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus])
[device setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
if ([device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance])
[device setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance];
[device unlockForConfiguration];
}
if(device.adjustingFocus == NO && device.adjustingExposure == NO && device.adjustingWhiteBalance == NO) {
[self actuallyCapture];
} else {
[device addObserver:self forKeyPath:@"adjustingExposure" options:NSKeyValueObservingOptionNew context:MyAdjustingExposureObservationContext];
[device addObserver:self forKeyPath:@"adjustingFocus" options:NSKeyValueObservingOptionNew context:MyAdjustingFocusObservationContext];
[device addObserver:self forKeyPath:@"adjustingWhiteBalance" options:NSKeyValueObservingOptionNew context:MyAdjustingWhiteBalanceObservationContext];
}
}
-(void) actuallyCapture
{
if ([session isRunning] == NO)
return;
connection = [output connectionWithMediaType:AVMediaTypeVideo];
[output captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
// save file etc ...
}];
}
アイデアは、カメラ デバイスがフォーカス、露出、またはホワイト バランスを調整しているかどうかを確認することです。actuallyCapture
そうでない場合は、すぐに電話してください。調整中の場合は、オブザーバーを追加actuallyCapture
して から呼び出しますobserveValueForKeyPath
。
問題はaddObserver
、デバイスがすべてを返すため、呼び出しが呼び出されないことですadjustingX==NO
が、それでも、キャプチャされた写真は暗いです。
その理由は何ですか?ホワイトバランスと露出の調整を適切に待っていますか?
私は正常に動作するデバイスしか所有していないため、デバッグするのは困難です。