| Crates.io | audio-io |
| lib.rs | audio-io |
| version | 0.2.0 |
| created_at | 2025-10-26 22:38:18.668141+00 |
| updated_at | 2025-10-27 22:43:04.877311+00 |
| description | A simple library to read and write audio files on your disk. |
| homepage | |
| repository | https://github.com/neodsp/audio-io |
| max_upload_size | |
| id | 1901963 |
| size | 536,248 |
A simple library to read and write audio files on your disk.
The library can read many formats and can write only to wav files.
You can read most common audio formats, if you specify them in the feature flags.
use audio_io::*;
let data: AudioData<f32> = audio_read("test.wav", AudioReadConfig::default()).unwrap();
let sample_rate = data.sample_rate;
let block = data.audio_block(); // convert into AudioBlock, which makes it easier to access channels or frames (does not allocate).
You can only write wav files.
use audio_io::*;
let sample_rate = 48000
let block = AudioBlockPlanarView::from_slice(&[[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]]);
audio_write("tmp.wav", block, sample_rate, AudioWriteConfig::default()).unwrap();
By leveraging audio-blocks you can write any audio layout, e.g.:
let block = AudioBlockInterleavedView::from_slice(&[0.0, 1.0, 0.0, 1.0, 0.0, 1.0], 2, 3);
audio_write("tmp.wav", block, sample_rate, AudioWriteConfig::default()).unwrap();
let block = AudioBlockSequentialView::from_slice(&[0.0, 0.0, 0.0, 1.0, 1.0, 1.0], 2, 3);
audio_write("tmp.wav", block, sample_rate, AudioWriteConfig::default()).unwrap();
Only royalty free codecs are enabled by default.
| Format | Feature Flag | Enabled by Default |
|---|---|---|
| AAC | aac |
No |
| ADPCM | adpcm |
Yes |
| ALAC | alac |
No |
| FLAC | flac |
Yes |
| CAF | caf |
No |
| ISO MP4 | isomp4 |
No |
| Matroska (MKV) | mkv |
Yes |
| MP1 | mp1 |
No |
| MP2 | mp2 |
No |
| MP3 | mp3 |
No |
| Ogg | ogg |
Yes |
| PCM | pcm |
Yes |
| AIFF | aiff |
No |
| Vorbis | vorbis |
Yes |
| WAV | wav |
Yes |
To enable all formats, use the all feature flag.
When reading a file you can specify the following things:
The crate will try to decode and store only the parts that you selected.
For writing audio you can only select to store the audio in Int16 or Float32.
By default Int16 is selected, for broader compatibility.
let audio = audio_read::<_, f32>(
"test.wav",
AudioReadConfig {
start: Position::Frame(300),
stop: Position::Frame(400),
..Default::default()
},
).unwrap();
use std::time::Duration;
let audio = audio_read::<_, f32>(
"test.wav",
AudioReadConfig {
stop: Position::Time(Duration::from_secs_f32(0.5)),
..Default::default()
},
).unwrap();
let audio = audio_read::<_, f32>(
"test.wav",
AudioReadConfig {
num_channels: Some(2),
..Default::default()
},
).unwrap();
let audio = audio_read::<_, f32>(
"test.wav",
AudioReadConfig {
first_channel: Some(1),
num_channels: Some(2),
..Default::default()
},
).unwrap();
Float32audio_write(
"tmp.wav",
data1.audio_block(),
data1.sample_rate,
AudioWriteConfig {
sample_format: WriteSampleFormat::Float32,
},
)
.unwrap();