What it reads, and what it writes
In. Multichannel WAV, 8 to 32-bit integer or 32/64-bit float, WAVE_FORMAT_EXTENSIBLE included. FLAC, to the format's own eight-channel ceiling. Ogg Vorbis at any channel count. IAMF carrying LPCM, standalone or wrapped in MP4.
Ambisonics too, ACN/SN3D to fourth order, rendered to headphones or to any speaker layout. A scene-based IAMF says it is a scene and is taken at its word. In a WAV, FLAC or Ogg the channel count is the only clue, and 4, 9, 16 or 25 channels is either a scene or a speaker layout, so the page asks.
Out. 24-bit WAV at whatever rate went in. Binaural is ordinary stereo with the spatial processing already in it, so it plays anywhere. Anything wider is an ordinary multichannel WAV that any DAW opens.
Not Opus, in IAMF or in Ogg. This build is pure Rust so that it can reach the browser at all, and the Opus decoder is C. You are told at load, before any conversion starts.
Headphone output
Binaural folds a whole immersive bed to two channels, putting every speaker where it would have been in a room. Three filter profiles: Direct is close and dry, Ambient opens out, Reverberant sits further back. Pick by ear while it plays.
Each filter carries its own latency and the output is trimmed by exactly that much, so a binaural render lines up sample-for-sample with its source.
Every speaker layout it handles
Thirty-two, and any of them renders to binaural or to any other. Anything marked input can be read from a file as well as rendered to. Sound systems E, F and G are targets only, since no file is authored in them.
| Layout | Channels | Height | Direction | Speakers |
|---|---|---|---|---|
| mono | 1 | -- | input + target | M+000 |
| stereo | 2 | -- | input + target | M+030, M-030 |
| 3.1.2 | 6 | 2 | input + target | M+030, M-030, M+000, LFE1, U+045, U-045 |
| 5.1 | 6 | -- | input + target | M+030, M-030, M+000, LFE1, M+110, M-110 |
| 5.1.2 | 8 | 2 | input + target | M+030, M-030, M+000, LFE1, M+110, M-110, U+030, U-030 |
| 5.1.4 | 10 | 4 | input + target | M+030, M-030, M+000, LFE1, M+110, M-110, U+030, U-030, U+110, U-110 |
| 7.1 | 8 | -- | input + target | M+030, M-030, M+000, LFE1, M+090, M-090, M+135, M-135 |
| 7.1.2 | 10 | 2 | input + target | M+030, M-030, M+000, LFE1, M+090, M-090, M+135, M-135, U+045, U-045 |
| 7.1.4 | 12 | 4 | input + target | M+030, M-030, M+000, LFE1, M+090, M-090, M+135, M-135, U+045, U-045, U+135, U-135 |
| 9.1.6 | 16 | 6 | input + target | M+060, M-060, M+000, LFE1, M+135, M-135, M+030, M-030, M+090, M-090, U+045, U-045, U+135, U-135, U+090, U-090 |
| 10.2.9.3 | 24 | 9 | input + target | M+060, M-060, M+000, LFE1, M+135, M-135, M+030, M-030, M+180, LFE2, M+090, M-090, U+045, U-045, U+000, T+000, U+135, U-135, U+090, U-090, U+180, B+000, B+045, B-045 |
| 7.1.5.4 | 17 | 5 | input + target | M+030, M-030, M+000, LFE1, M+090, M-090, M+135, M-135, U+045, U-045, T+000, U+135, U-135, B+045, B-045, B+135, B-135 |
| sound-system-e | 11 | 4 | target only | M+030, M-030, M+000, LFE1, M+110, M-110, U+030, U-030, U+110, U-110, B+000 |
| sound-system-f | 12 | 3 | target only | M+000, M+030, M-030, U+045, U-045, M+090, M-090, M+135, M-135, U+180, LFE1, LFE2 |
| sound-system-g | 14 | 4 | target only | M+030, M-030, M+000, LFE1, M+090, M-090, M+135, M-135, U+045, U-045, U+135, U-135, M+025, M-025 |
| lfe | 1 | -- | input + target | LFE1 |
| stereo-s | 2 | -- | input + target | M+110, M-110 |
| stereo-ss | 2 | -- | input + target | M+090, M-090 |
| stereo-rs | 2 | -- | input + target | M+135, M-135 |
| stereo-tf | 2 | 2 | input + target | U+045, U-045 |
| stereo-tb | 2 | 2 | input + target | U+135, U-135 |
| top-4ch | 4 | 4 | input + target | U+045, U-045, U+135, U-135 |
| 3.0ch | 3 | -- | input + target | M+030, M-030, M+000 |
| stereo-f | 2 | -- | input + target | M+060, M-060 |
| stereo-si | 2 | -- | input + target | M+090, M-090 |
| stereo-tpsi | 2 | 2 | input + target | U+090, U-090 |
| top-6ch | 6 | 6 | input + target | U+045, U-045, U+135, U-135, U+090, U-090 |
| lfe-pair | 2 | -- | input + target | LFE1, LFE2 |
| bottom-3ch | 3 | -- | input + target | B+000, B+045, B-045 |
| bottom-4ch | 4 | -- | input + target | B+045, B-045, B+135, B-135 |
| top-1ch | 1 | 1 | input + target | T+000 |
| top-5ch | 5 | 5 | input + target | U+045, U-045, T+000, U+135, U-135 |
Listening
It plays as soon as a file is in, before any conversion, so use it as a player if that is all you need. You always hear it binaurally: stereo hardware cannot play a 24-channel bed, and headphones are how it gets judged.
Check your input layout by ear while you are there. Name the wrong one and the centre channel lands in the surrounds, which you hear at once and would never spot on paper. Change the layout or the profile and it re-plays.
Click or drag the gauge to scrub. Play pauses where it stands; Stop returns to the start. Short files hold whole for scrubbing and long ones hold about six minutes; either way the conversion covers the file in full.
Nothing is uploaded
There is no server to upload to. Your audio is never transmitted or stored, nobody else sees it, and there is no account to make. Nothing has to fit through a request either, so how large a file you can convert is a question about your machine.
In Chrome and Edge a big WAV is streamed. The page reads a block, renders it, and writes it straight to the file you chose, holding about 8 MB however long the source is, so your disk sets the ceiling. Firefox and Safari cannot hand a page a file handle, so they convert in memory instead and stop near 3.2 GB. The page works yours out and tells you before it starts.
Questions
- What actually does the conversion?
- An independent implementation of OAR v1.0, written in Rust and compiled to WebAssembly so it runs in your tab. AOMedia published the specification on 30 July 2026. Their reference implementation is C with no WebAssembly target, so getting OAR into a browser meant writing one.
- It is the same renderer headless-daw uses offline, mounted straight from that engine's source. Its output here is byte-identical to a native render, which every build verifies.
- Is this the same as AOMedia’s IAMF web demo?
- No, though that demo is worth knowing about and came first. It decodes IAMF in the browser using libiamf and Google’s Open Binaural Renderer. This page uses OAR instead, also reads multichannel WAV, goes up to 24 channels where that one stops at 9.1.6, and streams files too large to hold in memory.
- What is the largest layout supported?
- 10.2.9.3, at 24 channels: ten ear-level, two LFE, nine height and three below. It is ITU-R BS.2051 Sound System H.
- Can I downmix 7.1.4 to 5.1, or to stereo?
- Yes. Choose Loudspeaker as the target and pick the layout you want. The renderer handles the downmix, height layers included.
- Why will it not read my IAMF file?
- Most likely it is Opus-coded. Only LPCM is read here, because this build stays pure Rust and the Opus decoder is C. Re-encode the stream as LPCM and it will read.
- Does it read FLAC and Ogg Vorbis?
- Yes, both. FLAC stops at eight channels, a limit of the FLAC format itself; Vorbis takes any count it carries. Because FLAC is lossless, converting a FLAC gives byte-for-byte the same output as converting the WAV it was made from, and the build proves it by hashing both.
- Can it render ambisonics?
- Yes, ACN/SN3D to fourth order, which is 25 channels, into binaural or any speaker layout. A scene-based IAMF is recognised from the file itself. A bare WAV carries no such declaration, so where the channel count could be either you choose, and choosing wrong is audible straight away.
- One case is refused rather than guessed: AmbiX projection mode stores substreams that need its demixing matrix applied to recover the components, and this build does not apply it. Re-encode the scene in mono mode, where each channel is one component.
- What sample rates work?
- Anything from 8 kHz to 192 kHz. The output keeps the source rate; no resampling happens.