2012-02-02 5 views
2

Я пытаюсь сделать работу с автофокусом в своем приложении, протестированной в iPad2. Моя проблема в том, что когда я вызывал методы проверки, такие как isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus, он всегда возвращает NO. Тем не менее, я мог нажать, чтобы сфокусироваться на других приложениях камеры в моем устройстве.AVFoundation Focus Mode iPad2

devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
for (AVCaptureDevice *tempDevice in devices) { 
    [tempDevice lockForConfiguration:nil]; 
    if ([tempDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) { 
     NSLog(@"Here"); 
    } 

    if ([tempDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) { 
     NSLog(@"Here"); 
    } 

    if ([tempDevice isFocusModeSupported:AVCaptureFocusModeLocked]) { 
     NSLog(@"Here"); 
    } 

    if ([tempDevice isFocusPointOfInterestSupported]) { 
     NSLog(@"Here"); 
    } 
    [tempDevice unlockForConfiguration]; 
} 

ответ

7

Я просто смотрел на это сегодня вечером. Из того, что я почерпнул, iPad 2 не делает фокус - он делает регулировка экспозиции - поэтому в приложении камеры по умолчанию, нажав на экран, появляется прямоугольник, в котором произошло крана, указывающее область, которую нужно сделать white point регулировка сверху.

Возможно, я ошибаюсь, но это то, что я обнаружил, и, похоже, подтвердил ваш API (isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus возвращение НЕТ).

Камеры в iPad 2 довольно слабы - особенно спереди. Я удивлен, что Apple отправила это.

ОБНОВЛЕНИЕ: Это код из более недавнего образца Apple AVCamDemo, который обрабатывает фокус + экспозицию + белую точку. Я не думаю, что это в примере AVCam. AVCamDemo может быть доступен только в качестве загрузки пакета .dmg кода WWDC из центра разработчика, а не в виде одной загрузки из Интернета. На моем iPad 2 код воздействия никогда не вызывается. // - от AVCamDemo:

- (BOOL) hasExposure 
{ 
AVCaptureDevice *device = [[self videoInput] device]; 

return [device isExposureModeSupported:AVCaptureExposureModeLocked] || 
     [device isExposureModeSupported:AVCaptureExposureModeAutoExpose] || 
     [device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]; 
} 

- (AVCaptureExposureMode) exposureMode 
{ 
return [[[self videoInput] device] exposureMode]; 
} 

- (void) setExposureMode:(AVCaptureExposureMode)exposureMode 
{ 
if (exposureMode == 1) { 
    exposureMode = 2; 
} 
AVCaptureDevice *device = [[self videoInput] device]; 
if ([device isExposureModeSupported:exposureMode] && [device exposureMode] != exposureMode) { 
    NSError *error; 
    if ([device lockForConfiguration:&error]) { 
     [device setExposureMode:exposureMode]; 
     [device unlockForConfiguration]; 
    } else { 
     id delegate = [self delegate]; 
     if ([delegate respondsToSelector:@selector(acquiringDeviceLockFailedWithError:)]) { 
      [delegate acquiringDeviceLockFailedWithError:error]; 
     } 
    } 
} 
} 

- (BOOL) hasWhiteBalance 
{ 
AVCaptureDevice *device = [[self videoInput] device]; 

return [device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked] || 
     [device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeAutoWhiteBalance]; 
} 

- (AVCaptureWhiteBalanceMode) whiteBalanceMode 
{ 
return [[[self videoInput] device] whiteBalanceMode]; 
} 

- (void) setWhiteBalanceMode:(AVCaptureWhiteBalanceMode)whiteBalanceMode 
{ 
if (whiteBalanceMode == 1) { 
    whiteBalanceMode = 2; 
}  
AVCaptureDevice *device = [[self videoInput] device]; 
if ([device isWhiteBalanceModeSupported:whiteBalanceMode] && [device whiteBalanceMode] != whiteBalanceMode) { 
    NSError *error; 
    if ([device lockForConfiguration:&error]) { 
     [device setWhiteBalanceMode:whiteBalanceMode]; 
     [device unlockForConfiguration]; 
    } else { 
     id delegate = [self delegate]; 
     if ([delegate respondsToSelector:@selector(acquiringDeviceLockFailedWithError:)]) { 
      [delegate acquiringDeviceLockFailedWithError:error]; 
     } 
    } 
} 
} 

- (BOOL) hasFocus 
{ 
AVCaptureDevice *device = [[self videoInput] device]; 

return [device isFocusModeSupported:AVCaptureFocusModeLocked] || 
     [device isFocusModeSupported:AVCaptureFocusModeAutoFocus] || 
     [device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]; 
} 

- (AVCaptureFocusMode) focusMode 
{ 
return [[[self videoInput] device] focusMode]; 
} 

- (void) setFocusMode:(AVCaptureFocusMode)focusMode 
{ 


AVCaptureDevice *device = [[self videoInput] device]; 
if ([device isFocusModeSupported:focusMode] && [device focusMode] != focusMode) { 
    NSError *error; 

     printf(" setFocusMode \n"); 
    if ([device lockForConfiguration:&error]) { 
     [device setFocusMode:focusMode]; 
     [device unlockForConfiguration]; 
    } else { 
     id delegate = [self delegate]; 
     if ([delegate respondsToSelector:@selector(acquiringDeviceLockFailedWithError:)]) { 
      [delegate acquiringDeviceLockFailedWithError:error]; 
     } 
    }  
} 
} 
+0

так, как это приложение показывает белый прямоугольник и есть некоторые эффекты изменения – vodkhang

+0

Посмотрите на пример AVCam (есть другой, я думаю, что более поздние 'AVCamDemo' вокруг тоже): http://developer.apple.com/library/ios/#samplecode/AVCam/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010112 –

+0

Я работаю с примером AVCam на данный момент, чтобы создайте собственный пользовательский интерфейс. Он содержит код, который проверяет isFocusPointOfInterestSupported. Мой iPad 2 определенно пропускает это. Я верю, что «новый» iPad использует его. – mpemburn