Flutter AudioService 每次获取 Fetch Url

Posted

技术标签:

【中文标题】Flutter AudioService 每次获取 Fetch Url【英文标题】:Flutter AudioService get Fetch Url every time 【发布时间】:2021-10-28 01:45:25 【问题描述】:

首先你好,

启动服务

await Audioservice.start(
      backgroundTaskEntrypoint: _audioPlayerTaskEntrypoint,
      params: 
        'index': globalIndex,
        'offline': offline,
        'quality': preferredQuality
      ,
      androidNotificationChannelName: 'BlackHole',
      androidNotificationColor: 0xFF181818,
      androidNotificationIcon: 'drawable/ic_stat_music_note',
      androidEnableQueue: true,
      androidStopForegroundOnPause: stopServiceOnPause,
    );


      await AudioService.updateQueue(globalQueue);

      await AudioService.play();

Override 这里添加了 url 部分。 但是如果我向api发送所有元素的请求,性能会很差。

 @override
  Future<void> onUpdateQueue(List<MediaItem> _queue) async 

    await AudioServiceBackground.setQueue(_queue);

    await AudioServiceBackground.setMediaItem(_queue[index!]);
    concatenatingAudioSource = ConcatenatingAudioSource(
      children: _queue
          .map((item)
      
        return AudioSource.uri(
         Uri.parse(item.extras!['url'].toString()),
          tag: item);
      
      )

          .toList(),
    );
    await _player.setAudioSource(concatenatingAudioSource);
    await _player.seek(Duration.zero, index: index);
    queue = _queue;
  

相反,如何在不播放项目的情况下向 remote api 发出请求并更新 url

这里有类似的东西,但我无法让它工作

How to fetch song details every time from an API before playing in just_audio and audio_service

【问题讨论】:

问题已解决。调试时,需要停止并再次运行。用于覆盖。我是如何解决这个问题的? 【参考方案1】:

这就是我解决问题的方法。

 @override
  Future<void> onSkipToQueueItem(String mediaId) async 

    final newIndex = queue.indexWhere((item) => item.id == mediaId);

    if (newIndex == -1) return;

    queue[newIndex].extras!['url'] = await SaavnAPI().get_mp3(queue[newIndex].extras!['url'].toString());


    AudioServiceBackground.setMediaItem(queue[newIndex]);
    _player.setUrl(queue[newIndex].extras!['url'].toString());
    await AudioServiceBackground.setQueue(queue);

    index = newIndex;
    _player.seek(Duration.zero, index: newIndex);
    if (!offline) addRecentlyPlayed(queue[newIndex]);

  

【讨论】:

以上是关于Flutter AudioService 每次获取 Fetch Url的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 和 Cloud Firestore 获取问题

Firebase + Flutter:获取用于登录的平台用户

Flutter 获取 Object 属性名称

Flutter - 让应用在设备离线时显示之前获取的数据

如何在 Flutter 中只解析一次 JSON

Flutter BLoC 事件竞争条件