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

如何在Flutter中优化连续音频播放?(基于just_audio库)

优化just_audio连续播放,消除切换延迟

你的问题出在播放完成后才去加载下一个音频,网络请求和资源解析的时间直接导致了切换延迟。just_audio本身提供了专门处理连续播放的API,用ConcatenatingAudioSource就能实现无缝切换,这是官方推荐的批量连续播放方案。

核心优化思路

ConcatenatingAudioSource可以把多个音频源组合成一个播放列表,just_audio会自动预加载下一个音频(默认提前加载1个),当前音频播放完成后会立刻切换到下一个,完全消除加载延迟。

优化后的代码示例

onPressed: () async {
  // 1. 把所有ayah的音频URL转换成AudioSource列表
  final audioSources = state.ayahList.map((ayahId) {
    return AudioSource.uri(
      Uri.parse('https://cdn.islamic.network/quran/audio/128/ar.alafasy/$ayahId.mp3'),
      // 可选:添加缓存,重复播放更快
      // cache: CacheAudioSource(),
    );
  }).toList();

  // 2. 创建拼接音频源
  final concatenatingSource = ConcatenatingAudioSource(
    children: audioSources,
    // 可选:设置循环播放整个列表
    // loopMode: LoopMode.all,
  );

  // 3. 设置音频源并播放
  await audioPlayer.setAudioSource(concatenatingSource);
  audioPlayer.play();

  // 可选:监听播放索引变化,替代原来的i变量
  audioPlayer.currentIndexStream.listen((index) {
    if (index != null) {
      print('当前播放第${index+1}个ayah: ${state.ayahList[index]}');
      // 如果需要在播放完所有后重置,不需要loopMode的话可以在这里处理
      if (index == state.ayahList.length - 1) {
        // 播放完最后一个后的逻辑,比如重置到开头
        // audioPlayer.seek(Duration.zero, index: 0);
      }
    }
  });
},

额外优化建议

  • 启用缓存:给每个AudioSource加上CacheAudioSource,可以把音频缓存到本地,重复播放时不需要重新下载。
  • 预加载数量调整:创建ConcatenatingAudioSource时可以设置preloadCount参数,比如preloadCount: 2,提前加载更多音频,进一步提升切换流畅度。
  • 避免重复监听:原代码每次点击都会新增一个playerStateStream的监听,容易导致内存泄漏和逻辑混乱,优化后的方案不需要手动监听播放完成事件,由组件自动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:16:04