Pure MoonBit MPEG-1/2/2.5 Layer III decoder with whole-file and streaming PCM APIs. Supports native, wasm, wasm-gc, and js backends.
$env:MOON_CC = (Resolve-Path tools/moon-cc-mingw.cmd).Path
$env:MOON_AR = (Get-Command ar).Sourcemoon run examples/mp3-to-wav --target native --release -- input.mp3 output.wavmoon build examples/browser --target js --release
python -m http.server 9010 --bind 127.0.0.1members = ["myapp", "mp3.mbt"]// myapp/moon.mod
import {
"enanandesu/mp3@0.1.0",
}
// myapp/moon.pkg
import {
"enanandesu/mp3",
}let audio = @mp3.decode_all(mp3_bytes)
let sample_rate = audio.sample_rate
let channels = audio.channels
let samples = audio.samplesmoon check
moon test
moon fmt --checkpython tools/validate_compatibility.pypython tools/test_mp3_to_wav.py
node tools/test_browser_decode.mjslet stream = @mp3.decode_frames(mp3_bytes, mode=Compatible)
let frames = stream.frames
let recoveries = stream.recoveries| 向量 | 兼容模式行为 |
|---|---|
| compl.bit | 确认 EOF 后丢弃不完整尾帧,记录偏移和丢弃字节数;EOF 前继续等待输入。 |
| hecommon.bit | 接受保留 emphasis 值 2,校验其他帧头字段并记录所在帧;不执行去加重处理。 |
| sin1k0db.bit | 初始缺少 reservoir 历史的帧不输出 PCM,但保留可用历史和 main data;记录所需/已有历史及帧偏移。首次输出后的历史不足仍为致命错误。尾帧按 EOF 规则处理。 |
| he_mode.bit | 保留每个 PcmFrame.channels 并记录声道变化;整段用 decode_frames 返回逐帧数组,decode_all 仍拒绝声道变化。 |
pub(all) suberror Mp3Error {
InvalidHeader(Int64)
InvalidTag
TruncatedFrame(Int64, Int)
UnsupportedVersion
UnsupportedFreeFormat
OutputLimit
NoAudio
DecodeFailure(Int64, DecodeError)
FramingFailure(Int64, FrameError)
FormatChange(Int64)
InvalidLimits
InvalidInputOffset(Int)
InputFinished
FailedDecoder
} derive(Eq, Show, Debug)type Decoderpub(all) enum Recovery {
TruncatedTail(offset~ : Int64, discarded_bytes~ : Int)
ReservedEmphasis(offset~ : Int64, value~ : Int)
MissingHistory(offset~ : Int64, frame_bytes~ : Int, required~ : Int, available~ : Int)
ChannelChange(offset~ : Int64, previous~ : Int, current~ : Int)
} derive(Eq, Show, Debug)fn decode_frames(data : Bytes, mode? : DecodeMode, limits? : Limits) -> DecodedStream raise Mp3ErrorInstall
Download zipPure MoonBit MPEG-1/2/2.5 Layer III decoder with whole-file and streaming PCM APIs. Supports native, wasm, wasm-gc, and js backends.