在没有队列的情况下更改AudioHandler.mediaItem



我正在开发我的第一个Flutter应用程序,它实现了基本的流功能。启动后,该应用程序从源a加载流。该应用程序包含导航菜单,允许用户播放来自其他源B、C、D等的流。我已经能够通过重载AudioHandler.playMediaItem(MediaItem-MediaItem(来更新播放的项目,以调用AudioPlayer.setUrl(MediaItem.id(:

class AudioPlayerHandler extends BaseAudioHandler {
  // Declare MediaItem used for streaming
  static const _initial_stream = MediaItem(
    id: someURL,
    title: 'Stream Title',
  );
  // Instantiate a just_audio AudioPlayer
  final _player = AudioPlayer();
  //Initialize audio handler
  AudioPlayerHandler() {
    _player.playbackEventStream.map(_transformEvent).pipe(playbackState);
    mediaItem.add(_initial_stream);
    _player.setAudioSource(AudioSource.uri(Uri.parse(_stream.id)));
  }
  @override
  Future<void> play() => _player.play();
  @override
  Future<void> pause() => _player.pause();
  @override
  Future<void> stop() => _player.stop();
  @override
  Future<void> playMediaItem(MediaItem mediaItem) => _player.setUrl(mediaItem.id);

在UI中,可以通过在onPressed((方法中实现以下内容来播放新的流:

var stream_b = MediaItem(
  id: someURL,
  title: 'Stream B',
);
audioHandler.playMediaItem(stream_b);
audioHandler.play();

我希望我的UI元素反映这一变化,但目前StreamBuilder仍然显示初始流,即使用户选择了不同的流。我尝试过实现AudioHandler.updateMediaItem((和AudioServiceBackground.setMediaItem(mediaItem(:

  @override
  Future<void> playMediaItem(MediaItem mediaItem) async {
    _player.setUrl(mediaItem.id);
    updateMediaItem(mediaItem);
    AudioServiceBackground.setMediaItem(mediaItem);
  }

但两者都不起作用。AudioServiceBackground.setMediaItem((已弃用,并显示了使用BaseAudioHandler.mediaItem的建议。当试图在我的UI中设置audioHandler.mediaItem=stream_b时,我看到一个错误,即audioHandler不包含设置mediaItem的方法;当我试图在audioHandler中实现我自己的方法时,我发现一个错误:由于mediaItem是BaseAudioClass中的最后一个字段,因此无法使用setter更改它。

考虑到mediaItem是BaseAudioHandler中的最后一个字段,我怀疑我更改/更新mediaItem的方法是不正确的。有人能建议一种方法来设置AudioHandler.mediaItem,以便在流生成器中使用它来显示当前正在播放的项目吗?

StreamBuilder<MediaItem?>(
 stream: audioHandler.mediaItem, // how to update mediaItem so this provides real-time information? 
 builder: (context, snapshot) {
   var mediaItem = snapshot.data;
   return Text(mediaItem?.title ?? '');
 },
),

将AudioProcessingState设置为空闲时,会从队列中删除MediaItem。只需将歌曲排队,然后设置AudioProcessingState.idle和AudioProcessing State.ready.

类似这样的东西:

playbackState.add(playbackState.value.copyWith(
        processingState:AudioProcessingState.idle));
var _item2 = MediaItem(
        id: '2',
        album: "Out of Time",
        title: "REM - Losing My Religion"
);
mediaItem.add(_item2)
playbackState.add(playbackState.value.copyWith(
        processingState:AudioProcessingState.ready));

这可能不是最好的方法,但它确实能完成任务。

我需要重写playMediaItem((,如下所示:

  @override
  Future<void> playMediaItem(MediaItem newItem) async {
    mediaItem.add(newItem);
    _player.setUrl(newItem.id);
  }

相关内容

  • 没有找到相关文章