On an iPhone 18 Pro running iOS 27, I’m seeing an interaction between locked frame timing and custom exposure.
I configure the wide camera for 4K at 29.97 fps:
input.activeLockedVideoFrameDuration =
CMTime(value: 1001, timescale: 30000)
With aperture and ISO fixed, I set exposure using the iOS 27 setExposureModeCustom(lensAperture:duration:iso:completionHandler:) API.
A controlled comparison produced:
- 10 ms requested: timing lock ON → 10.000 ms; OFF → 10.000 ms.
- 16 ms requested: timing lock ON → 16.129 ms; OFF → 16.129 ms.
- 20 ms requested: timing lock ON → 16.667 ms; OFF → 20.000 ms.
“OFF” means ordinary minimum and maximum frame durations both set to 1001/30000 seconds.
These are exposure values from per-frame camera metadata after valid completion timestamps and a settling period. The behaviour occurs both idle and during recording.
With the timing lock enabled, delivered frame timestamps show exact 30000/1001 pacing. Without it, fully manual capture measured approximately 29.964 fps.
Separately, with shutter fixed at 20 ms but ISO automatic, the locked-timing configuration held 20 ms and exact 29.97. That suggests exposure ownership affects the behaviour.
The documentation (https://developer.apple.com/documentation/avfoundation/avcapturedeviceinput/activelockedvideoframeduration) recommends exposure durations of half a frame or less to maintain full dynamic range, but doesn’t explicitly describe a duration clamp.
Is this expected behaviour?
- Does fully manual exposure impose a half-frame ceiling when locked frame timing is active?
- Is there an API to query that effective limit? The format’s advertised exposure range includes 20 ms.
- Is there a supported way to retain exact fractional frame timing and a longer fully manual exposure?
I can provide a minimal reproducer and device diagnostics.