首页 > 解决方案 > 如何使颤动的音频播放器更加一致

问题描述

我有一个应用程序,它使用节拍器对象来触发音频播放器播放声音。不幸的是,每次播放声音时都会有一些随机延迟,大约为 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)实现?

非常感谢您的任何输入:)

标签: androidflutterdart

解决方案


推荐阅读