我有一个应用程序,它使用节拍器对象来触发音频播放器播放声音。不幸的是,每次播放声音时都会有一些随机延迟,大约 0-100 毫秒。节拍器回调还改变了应用程序上一个图标的颜色,这看起来很稳定,所以我不认为是节拍器不一致(我还使用了节拍器回调中保存的一些日志来查看确定性它是,而且似乎在 几毫秒)。所以我宁愿认为音频抖动来自音频播放器。
我将音频播放器包装在这样的单例类中:
import 'package:audioplayers/audioplayers.dart';
class Audio {
static final AudioCache playerCache = AudioCache();
static AudioPlayer audioPlayer = AudioPlayer(mode: PlayerMode.LOW_LATENCY);
static void init(String file) async {
playerCache.load(
file,
);
}
static void play(String file) async {
audioPlayer = await playerCache.play(
file,
);
}
}
在代码中,我的应用运行 Audio.init('click.mp3');
,节拍器回调触发 Audio.play('click.mp3');
(这也是我在启用调试时更改图标颜色和保存日志的地方)。
到目前为止,我已经尝试将 mode: PlayerMode.LOW_LATENCY
添加到 playerCache.play
,但是这导致根本没有声音播放。我也试过同时使用 Metronome.epoch 和 Metronome.periodic,但这没有区别,就像我说的,节拍器触发器似乎非常一致(如果日志和视觉反馈是可信的,则在 +/- 5ms 内) ).
还需要注意的是,Android 模拟器上的抖动更严重,但在真实设备(使用 --release
选项构建)上仍然非常明显。
我是否对这个 AudioPlayers 包有太多的确定性? 100ms 抖动是它所能做到的最好的吗?有没有其他方法来构建代码以获得更一致的播放?还是我需要找出一个“较低级别”(即 Java/Kotlin/Swift)的实现?
非常感谢您的任何输入:)