You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Audio Waveforms包无法显示音频波形问题求助

解决audio_waveforms波形不显示及bufferData为null的问题

核心问题分析

你的代码存在几个关键问题导致波形无法加载:

  • preparePlayer是异步操作,未等待完成就访问bufferData
  • 文件列表初始化未正确处理异步逻辑,导致文件加载不及时
  • PlayerController未在dispose时释放资源

解决方案及代码修改

1. 等待preparePlayer完成后再访问bufferData

修改AudioWaveFormsWidget中的_preparePlayer方法,用await等待异步操作完成,确保bufferData被正确加载后再更新UI:

void _preparePlayer() async {
  bool exist = await widget.path.exists();
  if (exist) {
    await playerController1.preparePlayer(widget.path.path);
    if (mounted) setState(() {});
    print("--------------------------------${playerController1.bufferData}");
  }
}

2. 修复文件列表的异步初始化

修改MyHomePage中的initFileInDir方法,确保所有文件加载完成后再更新UI:

void initFileInDir() async {
  Directory finalPath = await _getDir();
  var exists = await finalPath.exists();
  if (exists) {
    await for (var element in finalPath.list(recursive: false)) {
      if (element is File) {
        _audioFile.add(element);
      }
    }
    if (mounted) setState(() {});
  }
}

同时在initState中直接调用异步方法,无需嵌套setState:

@override
void initState() {
  super.initState();
  _recordSub = record.onStateChanged().listen((recordState) {
    setState(() => _recordState = recordState);
  });

  initCheckPermission();
  initFileInDir();
}

3. 释放PlayerController资源

在_AudioWaveFormsWidgetState的dispose方法中添加PlayerController的释放,避免内存泄漏:

@override
void dispose() {
  playerController1.dispose();
  super.dispose();
}

4. 验证文件格式兼容性

尝试将录制格式改为wav测试,确认是否是编码兼容问题:

await record.start(
  path: '${finalPath.path}/${DateTime.now().millisecondsSinceEpoch}.wav',
  encoder: AudioEncoder.wav,
  bitRate: 128000,
  samplingRate: 44100,
);

额外注意事项

  • Android 13+需使用Permission.manageExternalStorage申请文件访问权限,替代旧的Permission.storage
  • 检查音频文件是否损坏,可通过其他播放器打开确认文件完整性

内容的提问来源于stack exchange,提问作者frank tchapo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:15:43