exhale
ecodis extended high-efficiency and low-complexity encoder - an open-source ISO/IEC 23003-3 (USAC, Extended HE-AAC) encoder
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, 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.
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
Section titled “Get it”Build from the source 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.
exhale 5 input.wav output.m4aThe 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:
ffmpeg -i input.flac -f wav - | exhale 5 output.m4aPresets 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
Section titled “Expert mode”Two extra positional arguments go between the preset and the input:
exhale b s 42 input.wav output.m4aThe 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
Section titled “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
Section titled “Full option reference”exhale 1.2.2 takes positional arguments only (exhaleApp.cpp); there is no --help, bitrate or thread option. Run it with no arguments to print usage.
exhale PRESET INPUT.wav OUTPUT.m4aexhale PRESET OUTPUT.m4a # WAV from stdinexhale PRESET MODIFIER INTERVAL INPUT.wav OUTPUT.m4a # expert modeexhale 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
Section titled “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 |