Я пытаюсь изменить длительность экспозиции сделанных фотографий.
В цикле:
for (customDuration, customISO) in zip(exposureDurations, exposureISOs) { // exposureDurations and exposureISOs are just arrays of exposures
// code here
}
Я установил экспозицию устройства AVCapture на свое собственное значение:
captureDevice = AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera,
for: AVMediaType.video,
position: .back) {
captureSession = AVCaptureSession()
capturePhotoOutput = AVCapturePhotoOutput()
do { try captureDevice.lockForConfiguration() }
catch { print("capturebracket: cannot lock camera for configuration."); return }
// set the correct exposure
captureDevice.setExposureModeCustom(duration: customDuration, iso: customISO, completionHandler: { (_) -> Void in exposureModeSet = true })
// unlock the capture device (sets changes)
captureDevice.unlockForConfiguration()
// wait for changes to propagate
while !exposureModeSet {}
// get the correct photo settings
let settings = AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecType.jpeg, AVVideoCompressionPropertiesKey : [AVVideoQualityKey : jpegQuality]])
Затем я печатаю значение, чтобы убедиться, что оно установлено правильно:
print("duration: \(captureDevice.exposureDuration)") // prints customExposure
print("device duration: \(( captureSession.inputs[0] as? AVCaptureDeviceInput)!.device.exposureDuration)") // prints customExposure
print("device duration: \((capturePhotoOutput.connections[0].inputPorts[0].input as? AVCaptureDeviceInput)!.device.exposureDuration)") // prints customExposure
photoSettings.isAutoStillImageStabilizationEnabled = false
Затем я делаю фотографию:
capturePhotoOutput.capturePhoto(with: photoSettings, delegate: self)
Каким-то образом, когда я перебираю вышеуказанный кодс разными экспозициями фотографии в итоге получают неправильные экспозиции.Конкретно первый прогон работает нормально.Второй будет иногда снимать с первой экспозицией, иногда со второй.Третий иногда будет фотографировать со вторым экспонированием, иногда с третьим, и так далее.
Интересно то, что когда я вставляю длинную, скажем, 1-3-секундную паузу непосредственно перед съемкой фотографии, все экспозиции устанавливаются правильно ... так что кажется, что изменения в AVCaptureDevice требуют временидля распространения, и photoOutput бросается вперед и делает снимок, прежде чем экспозиция была установлена правильно.
У кого-нибудь есть идеи?Не могу найти что-нибудь в документации об этом.