AudioSource¶
Reference to an audio file
AudioSource represents an audio file that can be used with AudioTrack or BackgroundAudio. It supports Flutter assets, file system paths, and remote URLs.
Table of Contents¶
Overview¶
AudioSource is an abstract class with factory constructors for different audio sources:
// From Flutter assets
AudioSource.asset('assets/audio/music.mp3')
// From file system
AudioSource.file('/path/to/music.mp3')
// From URL
AudioSource.url('https://example.com/music.mp3')
Factory Constructors¶
AudioSource.asset¶
Load audio from Flutter assets (defined in pubspec.yaml):
Requirements:
- File must be listed in pubspec.yaml under flutter.assets
- Path is relative to project root
AudioSource.file¶
Load audio from the file system:
Use cases: - User-selected files - Dynamically downloaded content - Server-side rendering with local files
AudioSource.url¶
Load audio from a remote URL:
Considerations: - Audio is downloaded during rendering - Requires network access - Consider caching for repeated renders
Examples¶
With AudioTrack¶
AudioTrack(
source: AudioSource.asset('assets/audio/effect.mp3'),
startFrame: 60,
durationInFrames: 30,
)
With BackgroundAudio¶
BackgroundAudio(
source: AudioSource.asset('assets/audio/music.mp3'),
volume: 0.7,
fadeInFrames: 30,
child: MyContent(),
)
Multiple Sources¶
final backgroundMusic = AudioSource.asset('assets/audio/music.mp3');
final soundEffect1 = AudioSource.asset('assets/audio/whoosh.mp3');
final soundEffect2 = AudioSource.file('/downloads/custom_sound.mp3');
final voiceover = AudioSource.url('https://api.example.com/audio/narration.mp3');
LayerStack(
children: [
AudioTrack(
source: backgroundMusic,
startFrame: 0,
durationInFrames: 300,
volume: 0.5,
),
AudioTrack(
source: soundEffect1,
startFrame: 60,
durationInFrames: 20,
),
AudioTrack(
source: soundEffect2,
startFrame: 120,
durationInFrames: 30,
),
AudioTrack(
source: voiceover,
startFrame: 30,
durationInFrames: 200,
),
// Visual content...
],
)
Dynamic Source Selection¶
AudioSource getAudioSource(AudioSourceType type, String path) {
switch (type) {
case AudioSourceType.asset:
return AudioSource.asset(path);
case AudioSourceType.file:
return AudioSource.file(path);
case AudioSourceType.url:
return AudioSource.url(path);
}
}
// Usage
final source = getAudioSource(config.sourceType, config.path);
Supported Formats¶
FFmpeg handles audio encoding, so most common formats are supported:
| Format | Extension | Notes |
|---|---|---|
| MP3 | .mp3 |
Most common, widely supported |
| AAC | .aac, .m4a |
Good quality, smaller files |
| WAV | .wav |
Uncompressed, large files |
| OGG | .ogg |
Open format |
| FLAC | .flac |
Lossless compression |
Recommendation: Use MP3 for general audio and WAV for sound effects requiring precise timing.
Best Practices¶
1. Organize Audio Assets¶
assets/
├── audio/
│ ├── music/
│ │ ├── background.mp3
│ │ └── outro.mp3
│ └── sfx/
│ ├── whoosh.mp3
│ ├── ding.mp3
│ └── click.mp3
2. Use Constants for Asset Paths¶
class AudioAssets {
static const backgroundMusic = 'assets/audio/music/background.mp3';
static const whoosh = 'assets/audio/sfx/whoosh.mp3';
static const ding = 'assets/audio/sfx/ding.mp3';
static const click = 'assets/audio/sfx/click.mp3';
}
// Usage
AudioSource.asset(AudioAssets.whoosh)
3. Predefine Common Sources¶
class AudioSources {
static final backgroundMusic = AudioSource.asset(AudioAssets.backgroundMusic);
static final whoosh = AudioSource.asset(AudioAssets.whoosh);
static final ding = AudioSource.asset(AudioAssets.ding);
}
// Usage
AudioTrack(
source: AudioSources.whoosh,
startFrame: 60,
durationInFrames: 20,
)
4. Handle Missing Audio Gracefully¶
For file or URL sources, consider the audio might not be available:
// Check file exists before using
if (await File(audioPath).exists()) {
return AudioSource.file(audioPath);
}
// Fallback to asset
return AudioSource.asset('assets/audio/default.mp3');
Related¶
- AudioTrack - Using audio sources
- BackgroundAudio - Background music
- Embedding Audio - Detailed audio guide