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

使用audio_waveforms加载本地音频报错:找不到指定文件

解决audio_waveforms加载assets音频文件的FileNotFoundException问题

问题原因

Flutter的assets资源并非直接映射到原生系统的文件路径,audio_waveforms底层依赖的ExoPlayer(Android端)无法直接识别assets/xxx这类路径,直接传入asset路径会触发文件找不到的错误。

解决方案

需要先将assets中的音频文件复制到应用的临时目录,再使用临时目录的文件路径来初始化播放器。具体步骤如下:

  1. 添加依赖
    在pubspec.yaml中添加path_provider依赖,用于获取应用临时目录:
dependencies:
  flutter:
    sdk: flutter
  audio_waveforms: ^最新版本号
  path_provider: ^2.0.15 # 可替换为当前最新版本
  1. 修改播放器初始化逻辑
    替换原有的initializePlayer方法,先将asset文件复制到临时目录,再使用临时路径初始化播放器:
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:audio_waveforms/audio_waveforms.dart';

class GroupMessage {
  late PlayerController player;

  Future<void> initializePlayer(String assetPath) async {
    player = PlayerController();
    // 获取应用临时目录
    final temporaryDir = await getTemporaryDirectory();
    // 提取文件名,拼接临时文件路径
    final fileName = assetPath.split('/').last;
    final tempAudioFile = File('${temporaryDir.path}/$fileName');

    // 检查临时文件是否已存在,避免重复复制
    if (!await tempAudioFile.exists()) {
      // 从assets加载文件字节数据
      final byteData = await rootBundle.load(assetPath);
      // 将字节数据写入临时文件
      await tempAudioFile.writeAsBytes(
        byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)
      );
    }

    // 使用临时文件路径初始化播放器
    await player.preparePlayer(path: tempAudioFile.path);
  }
}
  1. 验证pubspec.yaml配置
    确保assets配置正确,包含目标音频文件所在目录:
flutter:
  assets:
    - assets/audio/

额外注意事项

  • 路径大小写:iOS系统对文件路径大小写敏感,确保传入的asset路径与实际文件命名完全一致
  • 临时文件清理:如果需要节省存储空间,可以在播放完成后删除临时文件,或定期清理临时目录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:10:19