使用audio_waveforms加载本地音频报错:找不到指定文件
解决audio_waveforms加载assets音频文件的FileNotFoundException问题
问题原因
Flutter的assets资源并非直接映射到原生系统的文件路径,audio_waveforms底层依赖的ExoPlayer(Android端)无法直接识别assets/xxx这类路径,直接传入asset路径会触发文件找不到的错误。
解决方案
需要先将assets中的音频文件复制到应用的临时目录,再使用临时目录的文件路径来初始化播放器。具体步骤如下:
- 添加依赖
在pubspec.yaml中添加path_provider依赖,用于获取应用临时目录:
dependencies: flutter: sdk: flutter audio_waveforms: ^最新版本号 path_provider: ^2.0.15 # 可替换为当前最新版本
- 修改播放器初始化逻辑
替换原有的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); } }
- 验证pubspec.yaml配置
确保assets配置正确,包含目标音频文件所在目录:
flutter: assets: - assets/audio/
额外注意事项
- 路径大小写:iOS系统对文件路径大小写敏感,确保传入的asset路径与实际文件命名完全一致
- 临时文件清理:如果需要节省存储空间,可以在播放完成后删除临时文件,或定期清理临时目录
内容的提问来源于stack exchange,提问作者EgenSolve
相关产品推荐
相关产品推荐

