Tôi không chắc chắn nếu giải pháp này là giải pháp tốt nhất, vì tôi đã đấu tranh với điều này như bạn. Những gì tôi đã làm là lắng nghe những thay đổi trong bù trừ phơi sáng và, từ chúng, điều chỉnh ISO cho đến khi bạn đạt đến mức phơi sáng có thể chấp nhận được. Hầu hết mã này đã được lấy từ mã mẫu của Apple
Vì vậy, trước hết, bạn lắng nghe những thay đổi trên ExposureTargetOffset. Thêm vào khai lớp học của bạn:
static void *ExposureTargetOffsetContext = &ExposureTargetOffsetContext;
Sau đó, một khi bạn đã thực hiện cài đặt thiết bị của bạn đúng cách:
[self addObserver:self forKeyPath:@"captureDevice.exposureTargetOffset" options:NSKeyValueObservingOptionNew context:ExposureTargetOffsetContext];
(Thay vì captureDevice, sử dụng tài sản của mình cho các thiết bị) Sau đó thực hiện trong lớp của bạn gọi lại cho KVO:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if (context == ExposureTargetOffsetContext){
float newExposureTargetOffset = [change[NSKeyValueChangeNewKey] floatValue];
NSLog(@"Offset is : %f",newExposureTargetOffset);
if(!self.device) return;
CGFloat currentISO = self.device.ISO;
CGFloat biasISO = 0;
//Assume 0,3 as our limit to correct the ISO
if(newExposureTargetOffset > 0.3f) //decrease ISO
biasISO = -50;
else if(newExposureTargetOffset < -0.3f) //increase ISO
biasISO = 50;
if(biasISO){
//Normalize ISO level for the current device
CGFloat newISO = currentISO+biasISO;
newISO = newISO > self.device.activeFormat.maxISO? self.device.activeFormat.maxISO : newISO;
newISO = newISO < self.device.activeFormat.minISO? self.device.activeFormat.minISO : newISO;
NSError *error = nil;
if ([self.device lockForConfiguration:&error]) {
[self.device setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent ISO:newISO completionHandler:^(CMTime syncTime) {}];
[self.device unlockForConfiguration];
}
}
}
}
Với mã này, tốc độ màn trập sẽ vẫn không đổi và ISO sẽ được điều chỉnh để rời khỏi hình ảnh không quá dưới hoặc quá sáng.
Đừng quên xóa người quan sát bất cứ khi nào cần. Hy vọng điều này phù hợp với bạn.
Chúc mừng!
Cảm ơn bạn rất nhiều! Tôi phải đi và tìm hiểu về KVO nhưng đó có lẽ là thời gian tốt. Điều này có vẻ là làm việc tốt cho hầu hết các phần, mặc dù tôi trong một số tình huống ánh sáng tôi nhận được nhanh chóng nhấp nháy qua lại giữa hai ISO. Bạn đã làm việc ra một tập hợp các giá trị hoạt động trơn tru cho bạn? – Joe
Bạn có thể nhận xét dự án mẫu nào từ Apple bạn đã sử dụng không? – isaac
@isaac Xin lỗi, tôi nên đưa nó vào lúc đầu. Cảm ơn bạn đã chỉ ra điều đó. Vui lòng kiểm tra [link] này (https://developer.apple.com/library/ios/samplecode/AVCamManual/Introduction/Intro.html#//apple_ref/doc/uid/TP40014578-Intro-DontLinkElementID_2) – khose