如何获取队列中单个MediaItem的音频处理完成状态?
解决audio services监听单个MediaItem播放完成的问题
你遇到的问题是audio services 0.18.9版本中,AudioProcessingState.completed仅在整个队列最后一项播放结束时才触发,无法直接监听单个MediaItem的完成状态。可以通过跟踪当前播放项+对比播放位置与媒体时长的方式实现需求,具体代码如下:
// 定义变量跟踪当前正在播放的媒体项 MediaItem? _currentPlayingItem; // 监听当前播放项的变化,更新跟踪变量 audioHandler.currentItem.listen((item) { _currentPlayingItem = item; }); // 重置队列并切换到目标项 await audioHandler.stop(); await audioHandler.updateQueue(mediaItems); await audioHandler.skipToQueueItem(quran_page); // 监听播放状态,判断单个项是否播放完成 audioHandler.playbackState.listen((PlaybackState state) async { // 先确认当前播放的是目标项 if (_currentPlayingItem?.id != quran_page.id) return; final targetDuration = _currentPlayingItem?.duration; // 播放停止,且播放位置接近媒体时长(加500ms误差避免精准匹配问题) if (!state.playing && targetDuration != null && state.position >= targetDuration - const Duration(milliseconds: 500)) { await onAudioComplete(quran_page); } });
关键说明:
- 不依赖
AudioProcessingState.completed:因为该状态仅在队列耗尽时触发,单个项播放完会自动切到下一项,不会触发此状态。 - 误差补偿:加入500ms的缓冲,避免播放位置因精度问题无法完全等于时长,导致回调不触发。
- 流媒体适配:如果你的音频是无明确时长的流媒体,可以调整判断逻辑——比如监听播放状态从
playing变为idle且当前项仍为目标项时触发回调。
内容的提问来源于stack exchange,提问作者Adnan Hussain
相关产品推荐
相关产品推荐

