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

在just_audio中使用ConcatenatingAudioSource时如何捕获无效URL错误

错误未捕获的原因

你之前尝试的捕获方式都无效,核心原因是setAudioSource方法只会完成播放列表的初始化配置,不会等待所有音频资源预加载完成再返回,播放到无效URL时抛出的是异步运行时错误,不会被初始化阶段的try/catch捕获。同时just_audio(你使用的播放器核心库)默认不会把播放错误抛到各个状态流的onError回调中,而是会将错误信息封装到PlaybackEvent对象的属性中下发。

正确的捕获方案

修改你对playbackEventStream的监听逻辑,直接从事件对象中读取错误信息即可:

audioPlayer.playbackEventStream.listen((event) {
  // 检测当前事件是否携带错误
  if (event.error != null) {
    final error = event.error!;
    final stackTrace = event.stackTrace!;
    print('捕获到播放错误:$error');
    // 可以根据错误类型做对应处理,比如跳过无效音频
    if (error.toString().contains('Response code: 400')) {
      // 获取当前播放的音频索引
      final currentIndex = audioPlayer.sequenceState?.currentIndex;
      print('索引为$currentIndex的音频URL无效,自动跳过');
      // 跳过到下一首
      if (audioPlayer.hasNext) {
        audioPlayer.seekToNext();
      }
    }
  }
);

可选兜底配置

如果上述方案还是出现未捕获的错误,可以在初始化AudioPlayer时开启自动错误处理配置:

final audioPlayer = AudioPlayer(
  // 开启后遇到错误会自动暂停,不会抛出未处理异常
  automaticallyHandleInterruptions: true,
);

可选优化方案

如果想要避免播放过程中才触发错误,可以在构建ConcatenatingAudioSource之前,提前对所有音频URL做有效性检测:

// 检测URL是否有效的方法
Future<bool> checkAudioUrlValid(String url) async {
  try {
    final response = await http.head(Uri.parse(url));
    return response.statusCode >= 200 && response.statusCode < 400;
  } catch (e) {
    return false;
  }
}

构建播放列表时提前过滤掉无效URL即可,减少运行时错误的出现。

内容的提问来源于stack exchange,提问作者Hai Thien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:24:01