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

使用just_audio与audio_service添加歌曲到队列后无法播放问题

问题原因

你遇到的问题核心是_loadPlaylist方法并不仅仅是加载初始播放列表,同时承担了音频服务的初始化职责:

  • 原方法内部会调用setAudioSource类接口给底层播放器初始化音频源,让播放器从idle状态进入就绪状态
  • 注释该方法后,你直接调用addQueueItem仅完成了播放队列的元数据写入,底层播放器未收到音频源初始化指令,因此一直卡在加载状态,无法读取MediaItem中extras携带的音频url完成加载。
解决方案

以下三个方案可按需选择:

  1. 补全init方法的初始化逻辑
    注释_loadPlaylist后,在init方法中添加空音频源初始化逻辑,替代原方法的初始化作用,示例代码:
void init() async {
    // 新增空音频源初始化,对应原_loadPlaylist中的初始化动作
    await _audioHandler.setAudioSource(ConcatenatingAudioSource(children: []));
    _listenToPlaybackState();
    _listenToCurrentPosition();
    _listenToBufferedPosition();
    _listenToTotalDuration();
    _listenToChangesInSong();
    _listenToChangesInPlaylist();
}
  1. 首次添加歌曲时主动触发加载
    修改addMessageToPlayer方法,判断如果是队列首次添加内容,添加完成后主动触发播放器准备逻辑:
addMessageToPlayer(
      {required String id,
      required String title,
      required String album,
      required String url,
      required String artUri}) async {
    final mediaItem = MediaItem(
      id: id,
      title: title,
      album: album,
      extras: {
        'url': url,
        'artUri': artUri,
      },
    );
    await _audioHandler.addQueueItem(mediaItem);
    // 新增:如果添加前队列为空,主动触发加载
    if(_audioHandler.queue.value.length == 1){
      await _audioHandler.seek(Duration.zero, index: 0);
      // 若需要自动播放可补充调用 _audioHandler.play();
    }
  }
  1. 抽离_loadPlaylist的初始化逻辑
    如果原_loadPlaylist方法中只有初始列表加载是你不需要的,直接将方法内的音频服务初始化代码抽出来放到init中执行即可,无需完全注释整个方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:06:04