use std::env;
use std::fs::File;
use std::path::Path;
use symphonia::core::audio::sample::Sample;
use symphonia::core::codecs::audio::AudioDecoderOptions;
use symphonia::core::errors::Error;
use symphonia::core::formats::FormatOptions;
use symphonia::core::formats::probe::Hint;
use symphonia::core::io::MediaSourceStream;
use symphonia::core::meta::MetadataOptions;
use symphonia_core::formats::TrackType;
fn main() {
let args: Vec<String> = env::args().collect();
let file = Box::new(File::open(Path::new(&args[1])).unwrap());
let mss = MediaSourceStream::new(file, Default::default());
let hint = Hint::new();
let fmt_opts: FormatOptions = Default::default();
let meta_opts: MetadataOptions = Default::default();
let dec_opts: AudioDecoderOptions = Default::default();
let mut format =
symphonia::default::get_probe().probe(&hint, mss, fmt_opts, meta_opts).unwrap();
let track = format.default_track(TrackType::Audio).unwrap();
let mut decoder = symphonia::default::get_codecs()
.make_audio_decoder(track.codec_params.as_ref().unwrap().audio().unwrap(), &dec_opts)
.unwrap();
let track_id = track.id;
let mut samples: Vec<f32> = Default::default();
let mut total_sample_count = 0;
while let Some(packet) = format.next_packet().unwrap() {
if packet.track_id != track_id {
continue;
}
match decoder.decode(&packet) {
Ok(audio_buf) => {
samples.resize(audio_buf.samples_interleaved(), f32::MID);
audio_buf.copy_to_slice_interleaved(&mut samples);
total_sample_count += samples.len();
print!("\rDecoded {total_sample_count} samples");
}
Err(Error::DecodeError(_)) => (),
Err(_) => break,
}
}
}