Flutter中使用just_audio实现单音频无缝循环播放的问题
实现just_audio单音频无缝循环播放
问题根源
用LoopMode.one出现播放间隙,是因为播放器播放完音频后需要重新初始化加载该音频——哪怕是本地资源,解码和重启播放的过程也会产生微小延迟,最终导致间隙出现。
你当前方法的优缺点
你用ConcatenatingAudioSource重复添加同一个音频的方式,确实能在有限次数内实现无缝播放,但缺点很明显:
- 列表长度固定,循环到最后一个音频结束时还是会出现间隙
- 冗余的音频源定义不够简洁,资源管理效率也不高
更优的标准实现方式
just_audio专门提供了LoopingAudioSource用于实现单音频/多音频的无缝循环,直接设置无限循环即可:
final player = AudioPlayer(); await player.setAudioSource( LoopingAudioSource( count: 0, // 0代表无限循环,设置具体数字可指定循环次数 child: AudioSource.asset('audio/nature.mp3'), ), ); player.play();
如果是网络音频,用法类似:
final player = AudioPlayer(); await player.setAudioSource( LoopingAudioSource( count: 0, child: AudioSource.uri(Uri.parse('https://example.com/track1.mp3')), ), ); player.play();
这种方式底层会提前预加载下一次循环的音频资源,避免了重新初始化的延迟,真正实现无间隙循环。
补充:复杂场景下的无限无缝循环方案
如果需要更灵活的播放控制(比如中途切换循环音频),可以用ConcatenatingAudioSource结合播放状态监听,动态添加音频源实现无限循环:
final player = AudioPlayer(); final audioSource = AudioSource.asset('audio/nature.mp3'); final playlist = ConcatenatingAudioSource( useLazyPreparation: true, children: [audioSource, audioSource], ); await player.setAudioSource(playlist); player.play(); // 监听播放进度,当播放到最后一个音频时,自动追加新的音频源到列表末尾 player.currentIndexStream.listen((index) { if (index != null && index == playlist.children.length - 1) { playlist.add(audioSource); } });
这种方式通过预加载(useLazyPreparation: true)和动态追加,也能实现无限无缝循环,适合需要对播放列表做更多自定义操作的场景。
内容的提问来源于stack exchange,提问作者Chayan Biswas
相关产品推荐
相关产品推荐

