getAudioInfo method
Gets comprehensive information about an audio file
Analyzes the audio file and returns detailed information including format, duration, quality metrics, and compatibility information.
inputPath
- Path to the input audio file
Returns AudioInfo with comprehensive file information. Throws AudioAnalysisException if analysis fails.
Implementation
@override
Future<AudioInfo> getAudioInfo(String inputPath) async {
try {
// For web, we can get basic info using HTML Audio element
final audio = web.HTMLAudioElement();
final completer = Completer<AudioInfo>();
void onLoadedMetadata() {
final durationMs = (audio.duration * 1000).round();
final format = inputPath.split('.').last.toLowerCase();
final audioInfo = AudioInfo(
isValid: true,
durationMs: durationMs,
format: format,
mimeType: _getMimeTypeFromExtension(format),
channels: 2, // HTML Audio API doesn't expose channel count
sampleRate: 44100, // Default assumption for web
bitRate: 128, // Default assumption
supportedForConversion: false, // Not supported on web
supportedForTrimming: false, // Not supported on web
supportedForWaveform: true, // We can generate fake waveforms
);
completer.complete(audioInfo);
}
void onError() {
final audioInfo = AudioInfo(
isValid: false,
error: 'Failed to load audio file',
details: 'Web platform could not load the audio file at: $inputPath',
);
completer.complete(audioInfo);
}
// Set up event listeners
audio.addEventListener('loadedmetadata', onLoadedMetadata.toJS);
audio.addEventListener('error', onError.toJS);
// Set source and load
audio.src = inputPath;
audio.load();
return await completer.future.timeout(
const Duration(seconds: 10),
onTimeout:
() => AudioInfo(
isValid: false,
error: 'Audio loading timed out',
details: 'Failed to load audio information within 10 seconds',
),
);
} catch (e) {
return AudioInfo(
isValid: false,
error: 'Failed to get audio info on web',
details: e.toString(),
);
}
}