#mp3 #mpeg #audio-decoder #decoder

no-std minimp3

Rust bindings with a high-level wrapper for the minimp3 C library

14 releases

Uses new Rust 2024

0.6.1 Aug 15, 2025
0.5.2 Aug 10, 2025
0.5.1 Jan 2, 2021
0.5.0 Aug 27, 2020
0.1.0 Jan 31, 2018

#58 in Audio

Download history 6378/week @ 2025-10-25 7936/week @ 2025-11-01 6827/week @ 2025-11-08 6793/week @ 2025-11-15 7050/week @ 2025-11-22 6446/week @ 2025-11-29 6188/week @ 2025-12-06 6353/week @ 2025-12-13 7641/week @ 2025-12-20 6140/week @ 2025-12-27 6518/week @ 2026-01-03 3806/week @ 2026-01-10 6663/week @ 2026-01-17 6308/week @ 2026-01-24 7104/week @ 2026-01-31 3818/week @ 2026-02-07

25,143 downloads per month
Used in 35 crates (22 directly)

MIT license

79KB
1.5K SLoC

C 1K SLoC // 0.0% comments Rust 430 SLoC // 0.0% comments Shell 226 SLoC // 0.0% comments

minimp3-rs

Rust bindings with a high-level wrapper for the minimp3 C library.

The build process statically links all C code into the Rust library. There is no need for consumers to provide a library file of minimp3.

CAUTION ⚠️

This crate is not recommended for new projects due to multiple memory unsoundness issues and the availability of mature, safe Rust alternatives. Consider using fully Rust-based libraries instead, such as:

Cargo package Cargo package

Usage example

# Cargo.toml

[dependencies]
minimp3 = "<latest version from crates.io>"
use minimp3::{Decoder, Frame, Error};

use std::fs::File;

fn main() {
    let mut decoder = Decoder::new(File::open("audio_file.mp3").unwrap());

    loop {
        match decoder.next_frame() {
            Ok(Frame { data, sample_rate, channels, .. }) => {
                println!("Decoded {} samples", data.len() / channels)
            }
            Err(Error::Eof) => break,
            Err(e) => panic!("{:?}", e),
        }
    }
}

Async I/O

The decoder can be used with Tokio via the async_tokio feature flag.

# Cargo.toml

[dependencies]
minimp3 = { version = "0.4", features = ["async_tokio"] }

# tokio runtime
tokio = { version = "0.2", features = ["full"] }
use minimp3::{Decoder, Frame, Error};

use tokio::fs::File;

#[tokio::main]
async fn main() {
    let file = File::open("minimp3-sys/minimp3/vectors/M2L3_bitrate_24_all.bit").await.unwrap();
    let mut decoder = Decoder::new(file);

    loop {
        match decoder.next_frame_future().await {
            Ok(Frame {
                   data,
                   sample_rate,
                   channels,
                   ..
               }) => println!("Decoded {} samples", data.len() / channels),
            Err(Error::Eof) => break,
            Err(e) => panic!("{:?}", e),
        }
    }
}

Dependencies

~0.4–1.9MB
~33K SLoC