v153 · media · audio
Immersive Audio Model and Formats, in a media element
Spatial audio on the web has meant either a proprietary format or rebuilding the mix in the Web Audio API. IAMF is an open, royalty-free container for channel-based, scene-based and object-based audio — and Chrome 153 decodes it in ordinary media elements, through Media Source Extensions, like any other codec.
concepts
-
Three APIs, one question
MediaSource.isTypeSupported,canPlayTypeandmediaCapabilities.decodingInfoall answer "can you play this?" — differently. Ask all three about IAMF and about codecs this browser definitely has. -
Building the codec string
iamf.000.000.Opusis four fields, and getting any of them wrong turns a support check into a silent no. Assemble one from its parts and probe it as you go. -
The source ladder you would ship
IAMF first, stereo second — the markup that gives immersive audio to browsers that have it without breaking the ones that do not. Watch which rung this browser lands on, decided by its own answers.
why it shipped
An immersive mix is not a bigger stereo file. Channel-based audio is a fixed speaker layout, scene-based is an ambisonic field that can be rotated to follow a head, and object-based is a set of sources with positions that a renderer places. Delivering any of that on the web has meant a format the browser does not understand, decoded in JavaScript or WebAssembly and rendered through Web Audio — which works, and costs a decoder, a renderer, and the ability to use a plain <video> element.
IAMF is an open container for all three presentations, and decoding it in the media pipeline means the ordinary path works: a <source> element, Media Source Extensions, adaptive streaming, the platform's own output routing. The application stops carrying a decoder.
the codec string
audio/mp4; codecs="iamf.000.000.Opus"
─┬── ─┬─ ─┬─ ─┬──
│ │ │ └── the codec inside: Opus, mp4a.40.2, fLaC, ipcm
│ │ └────── the profile the additional layers use
│ └────────── the primary profile
└─────────────── the format itself
enabling it now
Not available on the Chrome 150 used to build these pages, with or without a flag. Measured across all three support APIs: every IAMF string returns unsupported, while audio/mp4; codecs="opus" returns supported from all three in the same run — so the negative is about the format rather than about the probe.
MediaSource.isTypeSupported('audio/mp4; codecs="iamf.000.000.Opus"') // false
MediaSource.isTypeSupported('audio/mp4; codecs="opus"') // true