我正在 Flutter 制作一个节拍器应用程序。我使用了 AudioPlayers 插件和 quiver.async 库中的 Metronome 类。以下是我用来实现此目的的部分代码:
import 'dart:async' show Future, StreamSubscription;
import 'dart:io' show File;
import 'package:flutter/services.dart' show ByteData, rootBundle;
import 'package:path_provider/path_provider.dart' show getTemporaryDirectory;
import 'package:audioplayers/audioplayer.dart' show AudioPlayer;
import 'package:quiver/async.dart' show Metronome;
...
File _soundFile;
/// List of possible sounds
List<String> _sounds = ['bottle', 'click', 'tamborine'];
int _soundIndex = 0;
/// Tempo of the metronome
static int tempo = 100;
bool _isPlaying = false;
Metronome _metronome = Metronome.periodic(Duration(milliseconds: (60000 / tempo).floor()));
StreamSubscription<DateTime> _subscription;
Future<ByteData> _loadSound() async {
return await rootBundle.load('assets/${_sounds[_soundIndex]}.mp3');
}
void _writeSound() async {
_soundFile = File(
'${(await getTemporaryDirectory()).path}/${_sounds[_soundIndex]}.mp3');
await _soundFile.writeAsBytes((await _loadSound()).buffer.asUint8List());
}
void _playLocal() async {
final AudioPlayer _audioPlayer = AudioPlayer();
AudioPlayer.logEnabled = false;
await _audioPlayer.play(_soundFile.path, isLocal: true);
}
/// The actual method that plays the metronome
void playMetronome() {
if (_soundFile == null) {
_writeSound();
}
setState(() {
if (_isPlaying) {
_subscription.cancel();
_isPlaying = false;
} else {
_subscription = _metronome.listen((d) => _playLocal());
_isPlaying = true;
}
});
}
有时虽然节拍器稍微落后,但足以让人注意到。我不知道是不是因为 AudioPlayer 或 Metronome。我怎样才能解决这个问题?
(我正在使用的 AudioPlayers 插件是这个)