android - 如何使颤动的音频播放器更加一致
问题描述
我有一个应用程序,它使用节拍器对象来触发音频播放器播放声音。不幸的是,每次播放声音时都会有一些随机延迟,大约为 0-100 毫秒。节拍器回调也改变了应用程序上一个图标的颜色,看起来很稳定,所以我不认为是节拍器不一致(我还使用了一些保存在节拍器回调中的日志来看看确定性如何确实如此,而且似乎在几毫秒之内)。所以我宁愿认为音频抖动来自音频播放器。
我已经将音频播放器包装在一个 Singleton 类中,如下所示:
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');
中,Metronome 回调触发器Audio.play('click.mp3');
(这也是我更改图标颜色并在启用调试时保存日志的地方)。
到目前为止,我已经尝试将 添加mode: PlayerMode.LOW_LATENCY
到 中playerCache.play
,但这会导致根本没有播放声音。我也尝试过同时使用 Metronome.epoch 和 Metronome.periodic,但这并没有什么区别,就像我说的,Metronome 触发器似乎非常一致(如果要相信日志和视觉反馈,则在 +/- 5 毫秒内)。
另请注意,Android 模拟器上的抖动更严重,但在真实设备上仍然非常存在(使用该--release
选项构建)。
我是否期望这个 AudioPlayers 包有太多的确定性?100ms 抖动是它所能做的最好的吗?有没有其他方法来构建代码以获得更一致的播放?还是我需要找出一个“低级”(即Java/Kotlin/Swift)实现?
非常感谢您的任何输入:)
解决方案
推荐阅读
- sql - 不是所有的行都通过使用 Teradata 中的 fastload 实用程序从 CSV 文件加载到 Teradata SQL 助手的表中?
- jenkins - Kubernetes jenkins - 权限被拒绝
- java - 返回灯泡状态改变的次数?
- javascript - TradingView 轻量级图表中的价格刻度线数量
- java - 我们可以在 Spring Data MongoDB 中手动增加 MongoDB 文档版本的版本吗?
- android - 我想在颤振中创建一个拖放应用程序
- javascript - 我用 JavaScript 做了一个井字游戏,但我不知道添加代码
- c++ - 如何使用 Hana 使 std::optional 成为运行时单子?
- laravel - laravel 存储文件夹的服务器前提重置
- networking - 如何限制/禁用网络上的上传