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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:17:17