audio-encode [](https://github.com/audiojs/audio-encode/actions/workflows/test.js.yml)

April 20, 2026 · View on GitHub

Encode raw audio samples to any format.
JS / WASM – no ffmpeg, no native bindings, works in both node and browser.
Small API, minimal size, near-native performance, stream encoding.

npm install encode-audio

import encode from 'encode-audio';

const buf = await encode.wav(channelData, { sampleRate: 44100 });

Supported formats:

FormatPackageEngine
WAV@audio/encode-wavJS
MP3@audio/encode-mp3WASM
OGG Vorbis@audio/encode-oggWASM
Opus@audio/encode-opusWASM
FLAC@audio/encode-flacWASM
AIFF@audio/encode-aiffJS

Whole-file encode

Specify the format as method name. Input is Float32Array[] (one per channel), a single Float32Array (mono), or an AudioBuffer.

import encode from 'encode-audio';

const wav  = await encode.wav(channelData, { sampleRate: 44100 });
const aiff = await encode.aiff(channelData, { sampleRate: 44100 });
const mp3  = await encode.mp3(channelData, { sampleRate: 44100, bitrate: 128 });
const ogg  = await encode.ogg(channelData, { sampleRate: 44100, quality: 5 });
const flac = await encode.flac(channelData, { sampleRate: 44100 });
const opus = await encode.opus(channelData, { sampleRate: 48000, bitrate: 96 });

Chunked encoding

Call with just options (no data) to create a streaming encoder:

import encode from 'encode-audio';

const enc = await encode.mp3({ sampleRate: 44100, bitrate: 128 });

const a = await enc(chunk1);  // Uint8Array
const b = await enc(chunk2);
const c = await enc(null);        // end of stream — flush + free

// explicit control: enc.flush(), enc.free()

Streaming

Pass an async iterable as data — returns an async generator:

import encode from 'encode-audio'

for await (let buf of encode.mp3(audioSource, { sampleRate: 44100, bitrate: 128 })) {
  // buf is Uint8Array
}

Works with any async iterable source.

Options

OptionDescriptionApplies to
sampleRateOutput sample rate (required)all
bitrateTarget bitrate in kbpsmp3, opus
qualityQuality 0–10 (VBR)ogg, mp3
channelsOutput channel countall
bitDepthBit depth: 16 or 32 (wav), 16 or 24 (aiff, flac)wav, aiff, flac
compressionFLAC compression level 0–8flac
application'audio', 'voip', or 'lowdelay'opus

Metadata

Splice tags, pictures, markers and regions into encoded bytes. Available for wav, mp3, flac.

import encode from 'encode-audio'
import { wav } from 'encode-audio/meta'

let bytes = await encode.wav(channelData, { sampleRate: 44100 })
let out = wav(bytes, {
  meta: { title: 'Hare Krishna', artist: 'Prabhupada', year: '1966' },
  markers: [{ sample: 44100, label: 'verse' }],
  regions: [{ sample: 88200, length: 44100, label: 'chorus' }]
})

Each codec sub-package also exposes its writer directly:

import { writeMeta } from '@audio/encode-mp3/meta'
let tagged = writeMeta(mp3Bytes, { meta: { title: 'foo' } })

See also

License

MIT