Skip to content

exhale

current

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
Last commit
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, 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.

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.

Terminal window
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:

Terminal window
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.

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

Terminal window
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.

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.

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.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 / parameterDefaultValues / unitsEffect
PRESETRequired; # means 30–9, a–g; 10–12 in expert modeBitrate preset. 0–9 are plain xHE-AAC; a–g add eSBR for low bitrates. Quote '#' in a shell.
INPUT.wavstdinWAV fileInput. Omit it to read WAV from stdin.
OUTPUT.m4aRequired.m4a or .mp4 filenameOutput MP4 file.
Expert MODIFIERNoneOne character: s, l, n (either case) or any otherExpert 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 INTERVALAbout one second10–99 framesExpert 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—FlagPrint version, architecture and build date, then exit.
-v—FlagPrint version and architecture, then exit.
No arguments—Empty invocationPrint usage.

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.

PresetSBRStereo target
0Off48 kbit/s
1Off64 kbit/s
2Off80 kbit/s
3, #Off96 kbit/s
4Off112 kbit/s
5Off128 kbit/s
6Off144 kbit/s
7Off160 kbit/s
8Off176 kbit/s
9Off192 kbit/s
10 (expert)Off208 kbit/s
11 (expert)Off256 kbit/s
12 (expert)Off288 kbit/s
aOn36 kbit/s
bOn48 kbit/s
cOn60 kbit/s
dOn72 kbit/s
eOn84 kbit/s
fOn96 kbit/s
gOn108 kbit/s