pub struct AudioDecoder { /* private fields */ }Expand description
An audio decoder for extracting audio frames from media files.
The decoder provides frame-by-frame access to audio content with support for resampling and format conversion.
§Construction
Use AudioDecoder::open() to create a builder, then call AudioDecoderBuilder::build():
use ff_decode::AudioDecoder;
use ff_format::SampleFormat;
let decoder = AudioDecoder::open("audio.mp3")?
.output_format(SampleFormat::F32)
.output_sample_rate(48000)
.build()?;§Frame Decoding
Frames can be decoded one at a time or using an iterator:
// Decode one frame
if let Some(frame) = decoder.decode_one()? {
println!("Frame with {} samples", frame.samples());
}
// Iterator form — AudioDecoder implements Iterator directly
for result in &mut decoder {
let frame = result?;
// Process frame...
}§Seeking
The decoder supports seeking to specific positions:
use std::time::Duration;
// Seek to 30 seconds
decoder.seek(Duration::from_secs(30))?;Implementations§
Source§impl AudioDecoder
impl AudioDecoder
Sourcepub fn open(path: impl AsRef<Path>) -> AudioDecoderBuilder
pub fn open(path: impl AsRef<Path>) -> AudioDecoderBuilder
Opens a media file and returns a builder for configuring the decoder.
This is the entry point for creating a decoder. The returned builder allows setting options before the decoder is fully initialized.
§Arguments
path- Path to the media file to decode.
§Examples
use ff_decode::AudioDecoder;
// Simple usage
let decoder = AudioDecoder::open("audio.mp3")?
.build()?;
// With options
let decoder = AudioDecoder::open("audio.mp3")?
.output_format(SampleFormat::F32)
.output_sample_rate(48000)
.build()?;§Note
This method does not validate that the file exists or is a valid
media file. Validation occurs when AudioDecoderBuilder::build() is called.
Sourcepub fn stream_info(&self) -> &AudioStreamInfo
pub fn stream_info(&self) -> &AudioStreamInfo
Returns the audio stream information.
This contains metadata about the audio stream including sample rate, channel count, codec, and format characteristics.
Sourcepub fn sample_rate(&self) -> u32
pub fn sample_rate(&self) -> u32
Returns the sample rate in Hz.
Sourcepub fn channels(&self) -> u32
pub fn channels(&self) -> u32
Returns the number of audio channels.
The type is u32 to match FFmpeg and professional audio APIs. When
integrating with rodio or cpal (which require u16), cast with
decoder.channels() as u16 — channel counts never exceed u16::MAX
in practice.
Sourcepub fn duration(&self) -> Duration
pub fn duration(&self) -> Duration
Returns the total duration of the audio.
Returns Duration::ZERO if duration is unknown.
Sourcepub fn duration_opt(&self) -> Option<Duration>
pub fn duration_opt(&self) -> Option<Duration>
Returns the total duration of the audio, or None for live streams
or formats that do not carry duration information.
Sourcepub fn container_info(&self) -> &ContainerInfo
pub fn container_info(&self) -> &ContainerInfo
Returns container-level metadata (format name, bitrate, stream count).
Sourcepub fn decode_one(&mut self) -> Result<Option<AudioFrame>, DecodeError>
pub fn decode_one(&mut self) -> Result<Option<AudioFrame>, DecodeError>
Decodes the next audio frame.
This method reads and decodes a single frame from the audio stream.
§Returns
Ok(Some(frame))- A frame was successfully decodedOk(None)- End of stream reached, no more framesErr(_)- An error occurred during decoding
§Errors
Returns DecodeError if:
- Reading from the file fails
- Decoding the frame fails
- Sample format conversion fails
§Examples
use ff_decode::AudioDecoder;
let mut decoder = AudioDecoder::open("audio.mp3")?.build()?;
while let Some(frame) = decoder.decode_one()? {
println!("Frame with {} samples", frame.samples());
// Process frame...
}Sourcepub fn decode_all(&mut self) -> Result<Vec<u8>, DecodeError>
pub fn decode_all(&mut self) -> Result<Vec<u8>, DecodeError>
Decodes all frames and returns their raw PCM data.
This method decodes the entire audio file and returns all samples as a contiguous byte buffer.
§Performance
- Memory scales with audio duration and quality
- For 10 minutes of stereo 48kHz F32 audio: ~110 MB
§Returns
A byte vector containing all audio samples in the configured output format.
§Errors
Returns DecodeError if:
- Decoding any frame fails
- The file cannot be read
§Examples
use ff_decode::AudioDecoder;
use ff_format::SampleFormat;
let mut decoder = AudioDecoder::open("audio.mp3")?
.output_format(SampleFormat::F32)
.build()?;
let samples = decoder.decode_all()?;
println!("Decoded {} bytes", samples.len());§Memory Usage
Stereo 48kHz F32 audio:
- 1 minute: ~11 MB
- 5 minutes: ~55 MB
- 10 minutes: ~110 MB
Sourcepub fn decode_range(
&mut self,
start: Duration,
end: Duration,
) -> Result<Vec<u8>, DecodeError>
pub fn decode_range( &mut self, start: Duration, end: Duration, ) -> Result<Vec<u8>, DecodeError>
Decodes all frames within a specified time range.
This method seeks to the start position and decodes all frames until the end position is reached. Frames outside the range are skipped.
§Arguments
start- Start of the time range (inclusive).end- End of the time range (exclusive).
§Returns
A byte vector containing audio samples within [start, end).
§Errors
Returns DecodeError if:
- Seeking to the start position fails
- Decoding frames fails
- The time range is invalid (start >= end)
§Examples
use ff_decode::AudioDecoder;
use std::time::Duration;
let mut decoder = AudioDecoder::open("audio.mp3")?.build()?;
// Decode audio from 5s to 10s
let samples = decoder.decode_range(
Duration::from_secs(5),
Duration::from_secs(10),
)?;
println!("Decoded {} bytes", samples.len());Sourcepub fn seek(
&mut self,
position: Duration,
mode: SeekMode,
) -> Result<(), DecodeError>
pub fn seek( &mut self, position: Duration, mode: SeekMode, ) -> Result<(), DecodeError>
Seeks to a specified position in the audio stream.
This method performs efficient seeking without reopening the file.
§Arguments
position- Target position to seek to.mode- Seek mode (Keyframe, Exact, or Backward).
§Errors
Returns DecodeError::SeekFailed if:
- The target position is beyond the audio duration
- The file format doesn’t support seeking
- The seek operation fails internally
§Examples
use ff_decode::{AudioDecoder, SeekMode};
use std::time::Duration;
let mut decoder = AudioDecoder::open("audio.mp3")?.build()?;
// Seek to 30 seconds with keyframe mode (fast)
decoder.seek(Duration::from_secs(30), SeekMode::Keyframe)?;
// Seek to exact position (slower but precise)
decoder.seek(Duration::from_secs(45), SeekMode::Exact)?;
// Decode next frame
if let Some(frame) = decoder.decode_one()? {
println!("Frame at {:?}", frame.timestamp().as_duration());
}Trait Implementations§
Source§impl Iterator for AudioDecoder
impl Iterator for AudioDecoder
Source§type Item = Result<AudioFrame, DecodeError>
type Item = Result<AudioFrame, DecodeError>
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
Source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk)N values. Read more1.0.0 · Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
1.0.0 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.0.0 · Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
nth element of the iterator. Read more1.28.0 · Source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
iter_intersperse)separator between items
of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse)separator
between items of the original iterator. Read more1.0.0 · Source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 · Source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n elements. Read more1.0.0 · Source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
1.29.0 · Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows)f for each contiguous window of size N over
self and returns an iterator over the outputs of f. Like slice::windows(),
the windows during mapping overlap as well. Read more1.0.0 · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read moreSource§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into)1.0.0 · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned)true precede all those that return false. Read more1.27.0 · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce)1.0.0 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find)1.0.0 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks)N elements of the iterator at a time. Read more1.11.0 · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read more1.5.0 · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd elements of
this Iterator with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by)1.5.0 · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator are lexicographically
less than those of another. Read more1.5.0 · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator are lexicographically
less or equal to those of another. Read more1.5.0 · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator are lexicographically
greater than those of another. Read more1.5.0 · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator are lexicographically
greater than or equal to those of another. Read more