audio_decode library

Native Ogg Vorbis and MP3 decoding to raw PCM for Dart, backed by Sean Barrett's stb_vorbis and lieff's minimp3 over FFI.

The C decoders are compiled from source by a Dart build hook, so there is no prebuilt binary to ship and no platform plugin or system library to install beyond a C toolchain. Decoding runs in native code and copies the result into a Dart Int16List, so callers never manage native memory. The same code path runs in pure Dart (CLI, servers, tests) and in Flutter.

Decoding is deterministic for a given build, and the geometry it reports is the same everywhere. Sample values are not bit-identical across CPU architectures: the decoders compute in floating point, so around 0.03% of samples can differ by one least-significant bit between arm64 and x86-64. Do not compare checksums of decoded PCM across a mixed fleet.

This is a decoder, not a player: it turns encoded bytes into PCM samples for waveforms, analysis, resampling, machine-learning preprocessing, games and servers. For playback, pair it with a player package such as just_audio or flutter_sound. encodeWav writes the decoded PCM back out as a WAV file so the samples can be saved or handed to other tools.

import 'dart:io';
import 'package:audio_decode/audio_decode.dart';

void main() {
  final bytes = File('clip.mp3').readAsBytesSync();
  final pcm = decodeAudio(bytes);
  print('${pcm.sampleRate} Hz, ${pcm.channels} ch, ${pcm.duration}');
  File('clip.wav').writeAsBytesSync(encodeWav(pcm));
}

See decodeAudio, decodeOgg, decodeMp3, detectFormat, PcmAudio and encodeWav for the full API.

Classes

AudioInfo
An audio stream's geometry, read without decoding it to PCM.
PcmAudio
Decoded pulse-code-modulation audio: raw 16-bit samples plus their geometry.

Enums

AudioFormat
The container format of an encoded audio buffer, as identified by detectFormat.

Functions

audioInfo(Uint8List bytes) AudioInfo
Reads bytes's geometry after sniffing its format with detectFormat, dispatching to oggInfo, mp3Info or wavInfo.
decodeAudio(Uint8List bytes) PcmAudio
Decodes bytes after sniffing its format with detectFormat, dispatching to decodeOgg, decodeMp3 or decodeWav.
decodeMp3(Uint8List bytes) PcmAudio
Decodes an MP3 stream to 16-bit PCM.
decodeOgg(Uint8List bytes) PcmAudio
Decodes an Ogg Vorbis stream to 16-bit PCM.
decodeWav(Uint8List bytes) PcmAudio
Decodes a RIFF/WAVE file holding uncompressed audio.
detectFormat(Uint8List bytes) AudioFormat
Identifies the container format of bytes from its leading bytes.
encodeWav(PcmAudio audio) Uint8List
Encodes audio as a canonical 16-bit PCM WAV (RIFF) file.
mp3Info(Uint8List bytes) AudioInfo
Reads an MP3 stream's geometry without producing any audio.
oggInfo(Uint8List bytes) AudioInfo
Reads an Ogg Vorbis stream's geometry without decoding any audio.
resample(PcmAudio audio, int targetRate) PcmAudio
Resamples audio to targetRate, keeping its channel count.
toMono(PcmAudio audio) PcmAudio
Mixes audio down to a single channel.
toSpeechPcm(PcmAudio audio, {int sampleRate = 16000}) PcmAudio
Mono at 16 kHz, the input shape on-device speech models ask for.
wavInfo(Uint8List bytes) AudioInfo
Reads a WAV file's geometry from its header, without decoding the samples.

Exceptions / Errors

AudioDecodeException
Thrown when decoding fails: the bytes are not valid audio of the expected format, or the native decoder rejected them.