Source#
Apple Developer Forums: AVMutableComposition audio silently drops on iOS 26 when streaming over HTTP/2 (FB22696516).
Problem#
On physical devices running iOS 26, an AVMutableComposition built from remotely streamed MP4 tracks can lose audio when the source is delivered over HTTP/2. The same media and composition logic work when the source is HTTP/1.1 or local. Direct AVPlayer playback of the same HTTP/2 asset also works.
Reported A/B matrix:
CloudFront HTTP/2 + AVMutableComposition → audio silent
Cloudflare HTTP/2 + AVMutableComposition → audio silent
Akamai HTTP/1.1 + AVMutableComposition → audio works
Apple TS HTTP/1.1 + AVMutableComposition → audio works
local file + AVMutableComposition → audio works
HTTP/2 + direct AVPlayer playback → audio works
The behavior did not reproduce on iOS 18.x, simulator, or macOS.
Evidence level#
Reproduced report / platform-regression hypothesis.
The A/B evidence strongly isolates the interaction between remote HTTP/2-backed asset reads and composition playback, but no public Apple statement currently establishes the internal root cause.
Debugging boundary#
Do not interpret this as a generic decoder or media-file failure. The same media decodes correctly in direct playback and when local.
Model the pipeline as:
remote AVURLAsset
→ HTTP transport / byte-range delivery
→ asset track reader
→ AVMutableComposition segment mapping
→ composition audio sample scheduling
→ decoder
→ renderer
The first meaningful divergence is between:
HTTP/2 remote asset + composition
and all control paths.
Investigation#
Instrument the composition and direct-playback paths separately. Capture:
OS build / device
URL / negotiated HTTP version
asset duration
source audio/video track identities
composition track identities
inserted CMTimeRanges
AVPlayerItem.status
AVPlayer.timeControlStatus
currentTime
accessLog/errorLog
first timestamp where audio becomes silent
network requests and Range headers around that timestamp
Verify whether the audio track remains logically present after the audible output disappears.
Questions to resolve:
- Does the composition continue advancing its audio timeline while output is silent?
- Are HTTP/2 requests for the audio source still occurring?
- Do byte-range offsets/content lengths differ from HTTP/1.1 control runs?
- Does replacing only the audio source with a local copy avoid the issue while video remains remote?
- Does preloading the source asset metadata/tracks change behavior?
- Does failure correlate with a composition edit boundary or happen inside a continuous segment?
Verification matrix#
A. iOS 18 physical + HTTP/2 + composition
B. iOS 26 physical + HTTP/2 + composition
C. iOS 26 simulator + HTTP/2 + composition
D. iOS 26 physical + HTTP/1.1 + composition
E. iOS 26 physical + local file + composition
F. iOS 26 physical + HTTP/2 + direct AVPlayer
G. iOS 26 physical + remote video / local audio composition
H. iOS 26 physical + local video / remote audio composition
Interpretation:
B only fails
→ OS/device-specific regression strongly supported
G works while H fails
→ remote audio source path is the discriminating dependency
network continues but composition audio timeline stalls
→ composition/sample scheduling boundary
network audio requests stop first
→ upstream resource-resolution boundary
Client mitigation#
Until the internal cause is identified, treat mitigation as version-scoped and evidence-based:
- Prefer direct
AVPlayerplayback when composition is not strictly required. - If composition is required and reproducible, test local prefetch/materialization of the affected source audio as a containment strategy.
- Do not infer that switching CDN vendors fixes the issue; reported behavior follows HTTP protocol rather than vendor.
- Preserve protocol, Range, timing, and track telemetry for Feedback Assistant.
Engineering rule#
If identical media decodes correctly in direct playback but fails only after being projected through
AVMutableComposition, separate source-resource delivery from composition sample scheduling before blaming codec or media validity.
A useful fault-isolation sequence is:
transport
→ byte-range/resource resolution
→ source track
→ composition segment mapping
→ composition sample scheduling
→ decoder
→ renderer
The first divergent stage between the working and failing A/B paths is the debugging boundary.
References#
- Apple Developer Forums report: FB22696516
- AVMutableComposition documentation: https://developer.apple.com/documentation/avfoundation/avmutablecomposition
- AVPlayerItemAccessLog / AVPlayerItemErrorLog for playback/resource telemetry