We've discovered a regression in iOS 26 where AVMutableComposition silently drops audio when the source asset is streamed over HTTP/2. The same file served over HTTP/1.1 plays audio correctly through the same composition code. Direct AVPlayer playback (without composition) works fine on HTTP/2. This did not occur on iOS 18.x.
It happens on physical devices only. It does not reproduce on a simulator or on macOS.
Tested conditions (same MP4 file, different CDNs):
- CloudFront (HTTP/2) + Composition → ❌ Audio silent
- Cloudflare (HTTP/2) + Composition → ❌ Audio silent
- Akamai (HTTP/1.1) + Composition → ✅ Audio works
- Apple TS (HTTP/1.1) + Composition → ✅ Audio works
- Downloaded locally, then composed → ✅ Audio works
- Direct playback, no composition (HTTP/2) → ✅ Audio works
The CloudFront and Akamai URLs serve the identical file — same S3 object, different CDN edge. CDN vendor doesn't matter; any HTTP/2 source triggers it.
Minimal reproduction:
let asset = AVURLAsset(url: http2URL)
let videoTrack = try await asset.loadTracks(withMediaType: .video).first!
let audioTrack = try await asset.loadTracks(withMediaType: .audio).first!
let duration = try await asset.load(.duration)
let composition = AVMutableComposition()
let fullRange = CMTimeRange(start: .zero, end: duration)
let compVideo = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)!
try compVideo.insertTimeRange(fullRange, of: videoTrack, at: .zero)
let compAudio = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)!
try compAudio.insertTimeRange(fullRange, of: audioTrack, at: .zero)
let item = AVPlayerItem(asset: composition.copy() as! AVComposition)
player.replaceCurrentItem(with: item)
player.play()
// Video plays, audio goes silent after a while
Playing the same asset directly works fine:
player.replaceCurrentItem(with: AVPlayerItem(asset: asset))
player.play() // Both video and audio work
Filed as FB22696516
Sample project: https://github.com/karlingen/AVCompositionBug