2014-10-11 2 views
3

저는 iOS 8에 도입 된 새로운 API로 카메라의 수동 컨트롤을 제공하는 앱을 개발 중이며 참조 용으로 WWDC 2014의 sample app을 사용하고 있습니다.노출 지속 시간을 수정하고 AVCaptureExposureModeContinuousAutoExposure로 돌아간 후 이상한 동작이 발생했습니다.

그러나 이상한 bahaviour (내 5s와 6) : 노출 모드를 "custom"로 설정 한 다음 "auto"로 설정 한 후 노출 지속 시간이 영향을받지 않는 것처럼 이미지가 계속 지연됩니다. 이 변화.

- (IBAction)changeExposureMode:(id)sender 
{ 
    UISegmentedControl *control = sender; 
    NSError *error = nil; 
    AVCaptureExposureMode mode = (AVCaptureExposureMode)[self.exposureModes[control.selectedSegmentIndex] intValue]; 

    if ([self.videoDevice lockForConfiguration:&error]) 
    { 
     if ([self.videoDevice isExposureModeSupported:mode]) 
     { 
      [self.videoDevice setExposureMode:mode]; 
     } 
     else 
     { 
      NSLog(@"Exposure mode %@ is not supported. Exposure mode is %@.", [self stringFromExposureMode:mode], [self stringFromExposureMode:self.videoDevice.exposureMode]); 
     } 
    } 
    else 
    { 
     NSLog(@"%@", error); 
    } 
} 


- (IBAction)changeExposureDuration:(id)sender 
{ 
    UISlider *control = sender; 
    NSError *error = nil; 

    double p = pow(control.value, EXPOSURE_DURATION_POWER); // Apply power function to expand slider's low-end range 
    double minDurationSeconds = MAX(CMTimeGetSeconds(self.videoDevice.activeFormat.minExposureDuration), EXPOSURE_MINIMUM_DURATION); 
    double maxDurationSeconds = CMTimeGetSeconds(self.videoDevice.activeFormat.maxExposureDuration); 
    double newDurationSeconds = p * (maxDurationSeconds - minDurationSeconds) + minDurationSeconds; // Scale from 0-1 slider range to actual duration 

    if (self.videoDevice.exposureMode == AVCaptureExposureModeCustom) 
    { 
     if (newDurationSeconds < 1) 
     { 
      int digits = MAX(0, 2 + floor(log10(newDurationSeconds))); 
      self.exposureDurationValueLabel.text = [NSString stringWithFormat:@"1/%.*f", digits, 1/newDurationSeconds]; 
     } 
     else 
     { 
      self.exposureDurationValueLabel.text = [NSString stringWithFormat:@"%.2f", newDurationSeconds]; 
     } 
    } 

    if ([self.videoDevice lockForConfiguration:&error]) 
    { 
     [self.videoDevice setExposureModeCustomWithDuration:CMTimeMakeWithSeconds(newDurationSeconds, 1000*1000*1000) ISO:AVCaptureISOCurrent completionHandler:nil]; 
    } 
    else 
    { 
     NSLog(@"%@", error); 
    } 
} 
+0

CGD 메인 스레드에서 두 가지 메소드 코드를 모두 추가하려고합니다. 도움이 될 수 있습니다 .... – hmdeep

답변

0

나도이 발견 : 여기

bug

(있는 수정없이 샘플 응용 프로그램에서) 각 단계에 포함 된 코드입니다. 느린 셔터 속도와 관련이있는 것 같습니다. 이것을 시도하십시오 : 관례에 가십시오. 빠른 셔터 속도를 설정하십시오. 그런 다음 자동으로 돌아갑니다. 붐, 너 거기있어. 이제 사용자 정의로 이동하여 느린 셔터 속도 (오른쪽 슬라이더)를 설정하십시오. 자동으로 돌아 가면 셔터 속도가 서서히 적당한 값으로 돌아가는 것을 볼 수 있습니다.

예제 코드 및이 예제 코드를 기반으로 작성한 응용 프로그램의 경우입니다. 나의 4s와 5s도 마찬가지입니다.

필자는 올바른 자동 설정을 선택하기 위해 센서가 특정 수의 이미지를 잡아야하기 때문에 이것이라고 생각합니다. 매우 느린 셔터 속도 (최대 1 초 최대)로 올바른 설정을 찾는데 몇 초가 걸릴 수 있습니다. 비록 우리가 원하는 것이 아니라 할지라도 일종의 의미가 있습니다. 다행히 나를 위해 내 앱은 1/4 초 이상의 셔터 속도를 필요로하지 않는다.

0

나는 내 자신의 코드에서 setExposureModeCustomWithDuration 메서드에 문제가 있음을 발견했습니다. 기간과 ISO가 장치에 설정된 후에 호출되어야하는 완성 처리기가 있지만 항상 작동하는 것은 아닙니다. 예를 들어 자동 노출에서 수동 노출로 전환 할 때 setExposureModeCustomWithDuration의 완료 핸들러에서 스틸을 가져 오는 경우 자동 노출 설정이 적용됩니다. 그 후에도 여전히 다른 것을 계속 복용하면 올바른 수동 노출이 설정됩니다.

완료 처리기 시작 부분에서 1 초 지연이이 문제를 해결하지만 적절한 솔루션이 될 수 없다는 것을 알게되었습니다.

나는 장치가 노출을 조정하지 않을 때까지 기다리는 완료 핸들러의 시작 부분에 대기/슬립 루프를 배치하여 시도했지만 도움이되지 않습니다.

+0

정확히 이것을 어떻게 해결 했습니까? 나는 심지어 5 초의 지연을 시도했지만 여전히 첫 번째 사진은 틀렸다. 그것을 우리와 공유하십시오. – manta

0

나는 동일한 샘플 앱을 사용해 보았지만 문제를 재현하려고했지만 지금은 수정할 수 없었습니다.