关于Flutter just_audio包缓存本地资产音频导致存储占用翻倍的问题咨询
Flutter just_audio包缓存本地资产音频导致存储占用翻倍的问题咨询
你好,针对你遇到的just_audio缓存本地资产音频导致存储占用翻倍的问题,我来帮你拆解原因并给出可行的解决方案:
为什么just_audio会缓存本地资产音频?
just_audio默认会把APK包内的资产音频复制到应用的缓存目录,主要原因有两个:
- 直接读取APK内部的文件可能存在性能瓶颈,尤其是在旧版本Android系统上,复制到缓存区能提升音频加载和播放的效率;
- 部分Android系统对APK内的文件读取有访问限制,缓存到应用私有目录可以规避这类权限问题。
即便你设置了useLazyPreparation: true,它也只是延迟了音频的准备工作,当某首音频首次被播放时,依然会完成缓存复制操作。当所有125首音频都被播放过一次后,缓存目录的大小就会和资产目录的大小差不多,最终导致应用整体存储占用翻倍。
解决存储占用问题的可行方案
1. 改用AssetSource加载资产音频(最优方案)
just_audio专门提供了AssetSource类用于直接加载本地资产文件,它可以跳过缓存复制步骤,直接从APK的资产目录读取音频,完全避免额外的存储占用。修改你的代码如下:
List<AudioSource> children = []; for (int i = 1; i <= 125; i++) { children.add( AssetSource( 'audio/${i.toString().padLeft(3, '0')}.mp3', tag: MediaItem(id: names[i - 1], title: names[i - 1]), ), ); } await _audioPlayer.setAudioSource( ConcatenatingAudioSource( children: children, useLazyPreparation: true, ), preload: false, );
注意:确保你的pubspec.yaml已经正确配置了资产路径,比如:
flutter: assets: - assets/audio/
2. 自定义缓存策略(仅当必须用AudioSource.uri时)
如果你因为特殊需求必须使用AudioSource.uri,可以通过自定义AudioCache来限制缓存大小或禁用缓存,但这种方式可能会影响播放性能,需谨慎使用:
final _audioPlayer = AudioPlayer( cache: AudioCache( maxCacheSize: 10 * 1024 * 1024, // 设置最大缓存为10MB,仅缓存少量文件 // 或者设置为0禁用缓存,但可能导致大音频播放卡顿 ), );
3. 清理历史缓存(可选)
如果你的应用已经产生了大量缓存文件,可以在应用启动时一次性清理旧缓存,但要注意不要清理正在使用的缓存。可以调用AudioCache的clearCache()方法:
await AudioCache().clearCache();
不过如果已经改用AssetSource,这个步骤就不需要了,因为不会再生成新的缓存文件。
备注:内容来源于stack exchange,提问作者Haidara




