如何在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
相关产品推荐
相关产品推荐

