Конфигурация AVCaptureDevice занимает непредсказуемое время для распространения на подключенный AVCapturePhotoOutput - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь изменить длительность экспозиции сделанных фотографий.

В цикле:

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 бросается вперед и делает снимок, прежде чем экспозиция была установлена ​​правильно.

У кого-нибудь есть идеи?Не могу найти что-нибудь в документации об этом.

...