# exhale

Canonical URL: https://encode.wiki/tools/software-encoders/exhale/
Content version: ca42e61ede0a24f789d7287a0001244ad22f4abf
Status: current
License: CC BY-SA 4.0
Checksum (SHA-256): a5e3e31989c4005d0524b828595b1e3753c1d9eb3fe0922f3f197c73934e45f1

> **Repository:** [ecodis/exhale](https://gitlab.com/ecodis/exhale). ecodis extended high-efficiency and low-complexity encoder - an open-source ISO/IEC 23003-3 (USAC, Extended HE-AAC) encoder. Latest release: [v1.2.2](https://gitlab.com/ecodis/exhale/-/releases/v1.2.2), Dec 20, 2025. Last commit: Dec 30, 2025. Stars: 48.

`exhale` ("Ecodis eXtended High-efficiency And Low-complexity Encoder") by Christian Helmrich turns WAV files into MPEG-D **USAC / xHE-AAC** in an M4A file, with loudness and peak metadata for decoders that support MPEG-D DRC. It is the only free xHE-AAC encoder. Version 1.2.2 (December 2025) is the latest and, per its release notes, the end of active development.

xHE-AAC is a different codec from [AAC-LC and HE-AAC](/codecs/audio/aac/), so ordinary AAC players cannot decode it. Use exhale only when the playback side is known to support USAC (current Android, Apple and Windows 11 platforms do). Otherwise encode AAC-LC or [Opus](/codecs/audio/opus/).

exhale implements the frequency-domain USAC tools only: no ACELP, TCX or MPEG Surround. It is built for medium and high bitrates, and its author asks that the lowest preset (`a`, about 36 kbit/s stereo or 18 kbit/s mono) be used only when required, since without those low-rate tools it does not show what xHE-AAC can do.

## Get it

Build from the [source](https://gitlab.com/ecodis/exhale) with `make release` on Linux or macOS (the binary lands in `bin/`), or open `exhale_vs2012.sln` on Windows. New releases are announced on [ecodis.de](https://www.ecodis.de).

## Usage

```sh
exhale 5 input.wav output.m4a
```

The first argument is a preset: `0`–`9` for plain xHE-AAC, `a`–`g` for lower rates with eSBR. Preset `5` is roughly 128 kbit/s stereo; `b` is roughly 48 kbit/s stereo with eSBR. Bitrates scale for mono and multichannel.

Input is WAV, from a file or stdin. The highest sample rate a preset accepts rises with the preset: preset 0 takes up to 32 kHz, 1 up to 44.1 kHz, 2 and above 48 kHz, and 5 and above 96 kHz; the eSBR presets need at least 22.05 kHz. Piping from FFmpeg avoids a lossless intermediate file:

```sh
ffmpeg -i input.flac -f wav - | exhale 5 output.m4a
```

Presets `a`–`g` support mono and stereo only; the numeric presets accept up to six channels. Rates follow 16 × preset + 48 kbit/s for `0`–`9` and 12 × index + 36 kbit/s for `a`–`g`; the table at the end lists them all.

### Expert mode

Two extra positional arguments go between the preset and the input:

```sh
exhale b s 42 input.wav output.m4a
```

The first is a single letter: `s` forces media time 0 in the edit list (seamless operation), `l` levels loudness to about −23 LUFS, `n` disables core noise filling (not recommended); any other letter, such as `x`, changes nothing. The second is the independent-frame interval, 10–99 encoded frames, which sets seeking granularity. Keep it under about 2.5 seconds, for example 78 at 32 kHz. Presets `10`–`12` (non-eSBR, very high rates) are only available in expert mode.

### Decoding in FFmpeg

FFmpeg 9.0.2 decodes exhale's eSBR output (presets `a`–`g`), but fails on non-eSBR files with "Not yet implemented in FFmpeg". Playback on Android, Apple platforms and Windows 11 is unaffected. Add `-xerror` when checking files with FFmpeg, otherwise it reports success despite the errors.

foobar2000 can run exhale as a custom encoder: set the encoder to `exhale.exe`, extension `m4a`, and parameters `# %d`, where `#` is the preset character.

## Full option reference

exhale 1.2.2 takes positional arguments only ([`exhaleApp.cpp`](https://gitlab.com/ecodis/exhale/-/blob/v1.2.2/src/app/exhaleApp.cpp)); there is no `--help`, bitrate or thread option. Run it with no arguments to print usage.

```text
exhale PRESET INPUT.wav OUTPUT.m4a
exhale PRESET OUTPUT.m4a                              # WAV from stdin
exhale PRESET MODIFIER INTERVAL INPUT.wav OUTPUT.m4a  # expert mode
exhale PRESET MODIFIER INTERVAL OUTPUT.m4a            # expert mode, stdin
```

| Argument / parameter | Default | Values / units | Effect |
| --- | --- | --- | --- |
| `PRESET` | Required; `#` means `3` | `0`–`9`, `a`–`g`; `10`–`12` in expert mode | Bitrate preset. `0`–`9` are plain xHE-AAC; `a`–`g` add eSBR for low bitrates. Quote `'#'` in a shell. |
| `INPUT.wav` | stdin | WAV file | Input. Omit it to read WAV from stdin. |
| `OUTPUT.m4a` | Required | `.m4a` or `.mp4` filename | Output MP4 file. |
| Expert `MODIFIER` | None | One character: `s`, `l`, `n` (either case) or any other | Expert mode only. `s` starts media time at 0 in the edit list; `l` levels loudness to about −23 LUFS; `n` disables noise filling; anything else, such as `x`, changes nothing. Only one applies. |
| Expert `INTERVAL` | About one second | `10`–`99` frames | Expert mode only. Frames between independent (seekable) frames. Keep it under about 2.5 seconds, e.g. at most 78 at 32 kHz. Anything else falls back to the default. |
| `-V` | — | Flag | Print version, architecture and build date, then exit. |
| `-v` | — | Flag | Print version and architecture, then exit. |
| No arguments | — | Empty invocation | Print usage. |

### Preset rates

Stereo targets as exhale reports them when encoding; actual bitrates vary with the content. Mono is half the stereo figure and 5.1 is 2.5 times it.

| Preset | SBR | Stereo target |
| --- | --- | --- |
| `0` | Off | 48 kbit/s |
| `1` | Off | 64 kbit/s |
| `2` | Off | 80 kbit/s |
| `3`, `#` | Off | 96 kbit/s |
| `4` | Off | 112 kbit/s |
| `5` | Off | 128 kbit/s |
| `6` | Off | 144 kbit/s |
| `7` | Off | 160 kbit/s |
| `8` | Off | 176 kbit/s |
| `9` | Off | 192 kbit/s |
| `10` (expert) | Off | 208 kbit/s |
| `11` (expert) | Off | 256 kbit/s |
| `12` (expert) | Off | 288 kbit/s |
| `a` | On | 36 kbit/s |
| `b` | On | 48 kbit/s |
| `c` | On | 60 kbit/s |
| `d` | On | 72 kbit/s |
| `e` | On | 84 kbit/s |
| `f` | On | 96 kbit/s |
| `g` | On | 108 kbit/s |
