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

