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

如何获取队列中单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:57:38