# @audio/decode-mp4

> Decode the audio track of MP4, MOV, M4A, M4V and 3GP files (AAC, ALAC, MP3, FLAC, Opus, AMR, PCM) to PCM samples

Latest version **1.1.1** (published 2026-08-29) · MIT license · 0 weekly downloads

## Install

```sh
npm install @audio/decode-mp4
pnpm add @audio/decode-mp4
yarn add @audio/decode-mp4
bun add @audio/decode-mp4
```

## Health

**Score 70/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; recently updated; high maintenance score; high quality score.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 1.1.1 |
| Published | 2026-08-29 |
| First published | 2026-08-27 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=18 |
| Dependencies | 8 |
| Unpacked size | 24.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 208 |
| Author | audiojs |
| Maintainers | jamen, dfcreative, dy |
| Keywords | mp4, mov, m4a, m4v, 3gp, quicktime, isobmff, demux, video, audio, decode, decoder, aac, alac, pcm |

## Links

- npm: https://www.npmjs.com/package/@audio/decode-mp4
- Repository: https://github.com/audiojs/decode
- Homepage: https://github.com/audiojs/decode/tree/main/packages/decode-mp4
- Issues: https://github.com/audiojs/decode/issues
- Funding: https://github.com/sponsors/audiojs
- npm.io page: https://npm.io/package/@audio/decode-mp4

## Dependencies (8)

- [@audio/decode-aac](https://npm.io/package/@audio/decode-aac.md) ^1.5.0
- [@audio/decode-ac3](https://npm.io/package/@audio/decode-ac3.md) ^1.0.0
- [@audio/decode-amr](https://npm.io/package/@audio/decode-amr.md) ^1.3.0
- [@audio/decode-dts](https://npm.io/package/@audio/decode-dts.md) ^1.0.0
- [@audio/decode-mp3](https://npm.io/package/@audio/decode-mp3.md) ^1.3.0
- [@audio/decode-eac3](https://npm.io/package/@audio/decode-eac3.md) ^1.0.0
- [@audio/decode-flac](https://npm.io/package/@audio/decode-flac.md) ^1.3.0
- [@audio/decode-opus](https://npm.io/package/@audio/decode-opus.md) ^1.3.0

## Alternatives

- [flatbuffers](https://npm.io/package/flatbuffers.md) — 6.0M weekly downloads
- [jwt-simple](https://npm.io/package/jwt-simple.md) — 259.5K weekly downloads
- [@exodus/patch-broken-hermes-typed-arrays](https://npm.io/package/@exodus/patch-broken-hermes-typed-arrays.md) — 28.5K weekly downloads
- [@native-to-anchor/buffer-layout](https://npm.io/package/@native-to-anchor/buffer-layout.md) — 12.2K weekly downloads
- [binary-parser-encoder](https://npm.io/package/binary-parser-encoder.md) — 5.3K weekly downloads

## Recent versions

- 1.1.1 (latest) — 2026-08-29
- 1.1.0 — 2026-08-27
- 1.0.0 — 2026-08-27

## README

# @audio/decode-mp4

Decode the audio track of MP4, MOV, M4A, M4V and 3GP files to PCM float samples.<br>
A pure-JS ISO BMFF demuxer that skips the video track and routes the audio (AAC, ALAC, MP3, FLAC, Opus, AC-3, DTS, AMR, PCM) to the matching codec package, loaded on demand.

[![npm install @audio/decode-mp4](https://nodei.co/npm/@audio/decode-mp4.png?mini=true)](https://npmjs.org/package/@audio/decode-mp4/)

```js
import decode, { decoder } from '@audio/decode-mp4'

let { channelData, sampleRate } = await decode(mp4Bytes)

let dec = await decoder()
let head = await dec.decode(chunk1)   // Promise on the chunk that completes the track header
let more = dec.decode(chunk2)         // synchronous from then on
let tail = await dec.flush()
dec.free()
```

## Codecs

| Sample entry | Codec | Decoded by |
|---|---|---|
| `mp4a` (esds object type 0x40, 0x66–0x68) | AAC-LC, HE-AAC v1/v2 | [@audio/decode-aac](../decode-aac) |
| `alac` | Apple Lossless | [@audio/decode-aac](../decode-aac) (pure JS) |
| `mp4a` (0x69, 0x6B), `.mp3` | MP3 | [@audio/decode-mp3](../decode-mp3) |
| `fLaC` | FLAC | [@audio/decode-flac](../decode-flac) |
| `Opus` | Opus | [@audio/decode-opus](../decode-opus) |
| `samr`, `sawb` | AMR-NB, AMR-WB | [@audio/decode-amr](../decode-amr) |
| `sowt`, `twos`, `in24`, `in32`, `fl32`, `fl64`, `lpcm`, `ipcm`, `fpcm`, `raw `, `NONE` | PCM 8–32 bit int, 32/64 bit float, either endianness | built in |
| `ulaw`, `alaw` | G.711 | built in |
| `ac-3`, `mp4a` (0xA5) | AC-3 | [@audio/decode-ac3](../decode-ac3) |
| `dtsc`, `dtsh`, `dtsl`, `dtse`, `mp4a` (0xA9) | DTS (core) | [@audio/decode-dts](../decode-dts) |
| `ec-3`, `mp4a` (0xA6) | E-AC-3 (Dolby Digital Plus) | [@audio/decode-eac3](../decode-eac3) |

TrueHD tracks throw an error naming the codec. Fragmented MP4 (`moof`) is not supported. QuickTime sound descriptions v0, v1 and v2 are handled, including `wave`-wrapped configs and `enda` endianness flags. When `moov` follows `mdat` (typical of camera and QuickTime output) the file is buffered until the header arrives.

Codec packages are imported dynamically, which is unavailable inside an AudioWorklet — decode in the main thread or a Worker.

## API

### `decode(src: Uint8Array | ArrayBuffer): Promise<AudioData>`

Decode a complete file.

### `decoder(): Promise<MP4Decoder>`

Streaming decoder. `decode(chunk)` returns `AudioData`, or a Promise of it on the chunk that completes the track header while the codec module loads. `flush()` returns remaining samples and throws if no audio track was found. `free()` releases codec resources.

### `AudioData`

```ts
{ channelData: Float32Array[], sampleRate: number }
```

## License

[ॐ](https://github.com/krishnized/license/) · [MIT](./LICENSE). Codec packages carry their own licenses.

---
_Source: https://npm.io/package/@audio/decode-mp4 · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
