@echogarden/wave-codec
Version:
A fully-featured WAVE format encoder and decoder. Written in pure TypeScript.
83 lines (63 loc) • 2.85 kB
Markdown
# WAVE encoder and decoder
Fully-featured encoder and decoder for the standard WAVE format.
* Written in pure TypeScript
* Supports all sample formats and bit-depths included in the core WAVE standard, including GUID-based sub-formats for PCM and Float sample formats, and the 8-bit A-law and Mu-law codecs
* Ignores unsupported or unknown sub-chunks like `LIST`, `fact`, `plst` and `junk`
* Supports reading and writing WAVE buffers larger than 4 GiB, by interpreting a chunk of length 2^32 - 1 to extend up to the end of the buffer (even if it's much larger). This is compatible with FFMpeg's input and output approach for long or streaming WAVE data
* Runs on Node.js, Deno, Bun, browsers
* No dependencies
## Installation
```
npm install @echogarden/wave-codec
```
## Basic usage
Encodes and decodes raw audio data given as a channel array of 32-bit float samples:
```ts
import { encodeWaveFromFloat32Channels, decodeWaveToFloat32Channels } from '@echogarden/wave-codec'
// A stereo pair with a few silent samples
const float32Channels = [
new Float32Array([0, 0, 0, 0]),
new Float32Array([0, 0, 0, 0]),
]
const waveData = encodeWaveFromFloat32Channels(float32Channels, 44100)
const decodedChannels = decodeWaveToFloat32Channels(waveData)
```
## Encoding and decoding to and from a raw data buffer
The data is given as a `Uin8Array`, and may contain any sample format supported by the WAVE standard, like 8-bit 16-bit, 24-bit, 32-bit integer raw integer PCM, 32-bit or 64-bit float, Alaw or Mulaw. Multiple channels should be interleaved.
```ts
import { encodeWaveFromDataBuffer, decodeWaveToDataBuffer, SampleFormat } from '@echogarden/wave-codec'
const audioBuffer = new Uint8Array([0, 0, 0, 0])
const waveData = encodeWaveFromBuffer(
audioBuffer, // Audio data
44100, // Sample rate
1, // Channel count
16, // Bit depth, can be 8, 16, 24, or 32 for PCM, 32 or 64 for Float, 8 for Alaw and Mulaw
SampleFormat.PCM, // Sample format, can be PCM, Float, Alaw or Mulaw
0 // Speaker position mask (used for multichannel audio)
)
const { decodedAudioBuffer,
sampleRate,
channelCount,
bitDepth,
sampleFormat,
speakerPositionMask } = decodeWaveToBuffer(waveData)
```
## Converting between 32-bit float channels and data buffers
These methods are used internally to convert any supported sample format to and from 32-bit float channels, and are exposed as utility methods.
32-bit float channel array -> audio data buffer:
```ts
float32ChannelsToBuffer(
audioChannels: Float32Array[],
targetBitDepth: BitDepth = 16,
targetSampleFormat: SampleFormat = SampleFormat.PCM): Uint8Array
```
Audio data buffer -> 32-bit float channel array:
```ts
bufferToFloat32Channels(
audioBuffer: Uint8Array,
channelCount: number,
sourceBitDepth: BitDepth,
sourceSampleFormat: SampleFormat): Float32Array[]
```
## License
MIT