Code examples and sample applications demonstrating Symphonia usage
Symphonia provides several examples demonstrating common use cases, from basic decoding to advanced audio processing. All examples are available in the GitHub repository.
use symphonia::core::codecs::{DecoderOptions, CODEC_TYPE_NULL};use symphonia::core::errors::Error;use symphonia::core::formats::FormatOptions;use symphonia::core::io::MediaSourceStream;use symphonia::core::meta::MetadataOptions;use symphonia::core::probe::Hint;// Open the media sourcelet src = std::fs::File::open(path).expect("failed to open media");let mss = MediaSourceStream::new(Box::new(src), Default::default());// Create a probe hint using the file's extensionlet mut hint = Hint::new();hint.with_extension("mp3");// Probe the media sourcelet probed = symphonia::default::get_probe() .format(&hint, mss, &FormatOptions::default(), &MetadataOptions::default()) .expect("unsupported format");let mut format = probed.format;// Find the first audio tracklet track = format .tracks() .iter() .find(|t| t.codec_params.codec != CODEC_TYPE_NULL) .expect("no supported audio tracks");// Create a decoder for the tracklet mut decoder = symphonia::default::get_codecs() .make(&track.codec_params, &DecoderOptions::default()) .expect("unsupported codec");let track_id = track.id;
loop { // Get the next packet from the format let packet = match format.next_packet() { Ok(packet) => packet, Err(Error::ResetRequired) => { // Track list changed (e.g., chained OGG streams) unimplemented!(); } Err(err) => { // Unrecoverable error panic!("{}", err); } }; // Check for new metadata while !format.metadata().is_latest() { format.metadata().pop(); // Process metadata here } // Skip packets from other tracks if packet.track_id() != track_id { continue; } // Decode the packet match decoder.decode(&packet) { Ok(_decoded) => { // Process decoded audio samples } Err(Error::IoError(_)) => continue, Err(Error::DecodeError(_)) => continue, Err(err) => panic!("{}", err), }}
This example forms the basis for most Symphonia applications. Master this pattern before moving to more advanced use cases.
SampleBuffer provides several important capabilities:
Format Conversion: Converts audio to a specified sample type (f32, i16, etc.)
Interleaving: Converts planar audio to interleaved format
Playback Ready: Output is ready for audio APIs expecting interleaved samples
Most audio playback APIs (CPAL, SDL, PortAudio) expect interleaved samples. This example shows the standard pattern for preparing audio for these APIs.
git clone https://github.com/pdeljanov/Symphonia.gitcd Symphonia# Run getting-started examplecargo run --example getting-started /path/to/audio.mp3# Run basic-interleaved examplecargo run --example basic-interleaved /path/to/audio.flac
Ensure you have the necessary feature flags enabled for your audio format. For example, MP3 support requires the mp3 feature flag.
// Seek to a specific time (in time base units)let seek_to = SeekTo::Time { time: Time::from_seconds(30.0), track_id: Some(track_id) };format.seek(SeekMode::Accurate, seek_to)?;
// Access metadata tagsif let Some(metadata_rev) = format.metadata().current() { for tag in metadata_rev.tags() { println!("{}: {}", tag.std_key, tag.value); }}
// Get all audio trackslet audio_tracks: Vec<_> = format .tracks() .iter() .filter(|t| t.codec_params.codec != CODEC_TYPE_NULL) .collect();// Create decoders for each trackfor track in audio_tracks { let decoder = symphonia::default::get_codecs() .make(&track.codec_params, &DecoderOptions::default())?; // Store and use decoder}