Configuration detail and the measurements behind the numbers in the original post.
Session configuration. One plain AVCaptureSession; AVCaptureMultiCamSession is not used anywhere in the app. One input (.builtInWideAngleCamera, back), one AVCaptureVideoDataOutput, no depth output, no AVCaptureDataOutputSynchronizer, no audio input in this session. activeVideoMinFrameDuration == activeVideoMaxFrameDuration == CMTime(1, 30), set before the AVCaptureDeviceInput is created and never rewritten while a follow is live. preferredVideoStabilizationMode = .off, alwaysDiscardsLateVideoFrames = false.
Preflight, logged immediately before every follow(), verbatim from Device A:
follow preflight: format=4032x3024 extSyncSupported=true minSyncDur=1/60 (valid=true) autoVFR=false
follow preflight: format=1920x1440 extSyncSupported=true minSyncDur=1/60 (valid=true) autoVFR=false
The Device B preflight line was not retained — same binary, same code path.
Reference signal. Two configurations were exercised; all drop data is from (2).
An output labelled "FHD 29.97" that empirically pulses at 59.94 Hz. Followed with CMTime(1001, 60000) against 1920x1080 it locks in ~2 s and the sensor runs at half rate (measured interval 33.330 ms ± 0.786 ms). Followed at a nominal 29.97 it never leaves .calibrating and the delegate reports back .ready, matching the documented "not close enough" behavior.
A generator confirmed to output a true, exact 30.00 fps, followed with CMTime(1, 30).
Single-variable isolation, Device B (26.5.2). All cold .nominal starts, all recording.
4032x3024 + in-session mic + live preview drop at 6 s (.nominal / .nominal)
1920x1080 + preview off + in-session mic drop at 37 s (.nominal / .fair)
1920x1080 + preview off + mic off 211.9 s / 6358 frames, LOCK HELD, zero drops
4032x3024 + preview off + mic off drop at 102 s (.nominal / .nominal)
Removing the mic input took the 1080p case from a 37 s drop to a run held end to end, so session load is a strong lever on how long the lock survives. But with recording off, audio off and all other in-app collection disabled, at 1920x1440, the follow still dropped, and detaches also occur during idle follow with no recording at all.
Device A flaps. No .activeSync → .ready + nil detach has ever been recorded on this unit. Its only interruptions are flaps where the follow stays attached and the status returns on its own — 7 in one day's log, all ~1 s except one ~22 s, all while not recording:
[07:12:25] status: LOCKED → FREE-RUN
[07:12:26] status: FREE-RUN → LOCKED
[07:57:22] transient UNAVAILABLE after lock — follow still attached, staying locked
[07:57:22] status: UNAVAILABLE → FREE-RUN
[07:57:44] status: FREE-RUN → LOCKED
Device B takes the coast sometimes too: one cold-start .activeSync → .unavailable → .freeRunSync → .activeSync recovery in ~1 s, follow still attached, no flash. But no confirmed drop has ever gone through .freeRunSync.
Head-to-head. One directly paired run, identical binary and configuration (4032x3024, 30 fps, HEVC 8-bit, Apple Log off), both recording, both at .serious: Device A completed the full 601 s window with zero drops, Device B dropped at 13 s. I do not treat 13 s as a clean number — that Device B process had already churned through a previous drop in the same launch. A freshly launched process on B has held 9–11 minutes.
Wedge state, system-level and cross-app. A crash or force-quit while sync is engaged, or an activeFormat change mid-sync, leaves the device in a state where no app — including Blackmagic Camera — can calibrate afterwards. A ProDock power cycle does not clear it; only rebooting the iPhone does. Every measurement above comes from a session that first demonstrated a clean ~2 s lock, so none was taken inside a wedge window.
Topic:
Media Technologies
SubTopic:
Video
Tags: