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

  1. Three APIs, one question

    MediaSource.isTypeSupported, canPlayType and mediaCapabilities.decodingInfo all answer "can you play this?" — differently. Ask all three about IAMF and about codecs this browser definitely has.

  2. Building the codec string

    iamf.000.000.Opus is 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.

  3. 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

references