You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Flutter just_audio包缓存本地资产音频导致存储占用翻倍的问题咨询

Flutter just_audio包缓存本地资产音频导致存储占用翻倍的问题咨询

你好,针对你遇到的just_audio缓存本地资产音频导致存储占用翻倍的问题,我来帮你拆解原因并给出可行的解决方案:

为什么just_audio会缓存本地资产音频?

just_audio默认会把APK包内的资产音频复制到应用的缓存目录,主要原因有两个:

  1. 直接读取APK内部的文件可能存在性能瓶颈,尤其是在旧版本Android系统上,复制到缓存区能提升音频加载和播放的效率;
  2. 部分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. 清理历史缓存(可选)

如果你的应用已经产生了大量缓存文件,可以在应用启动时一次性清理旧缓存,但要注意不要清理正在使用的缓存。可以调用AudioCacheclearCache()方法:

await AudioCache().clearCache();

不过如果已经改用AssetSource,这个步骤就不需要了,因为不会再生成新的缓存文件。

备注:内容来源于stack exchange,提问作者Haidara

火山引擎 最新活动