带有进度条的Flutter背景音频



我想播放流中的音频。我使用了Just Audio。我想要一个像音频视频进度条一样的进度条,也可以使用音频服务在后台播放音频。

我已经使用了所有这些例子,它们都是单独工作的,但我无法将它们连接起来。你能帮我举一个我该怎么做的例子吗?

audio_service插件中的示例包含如何将audio_service与just_audio一起使用。(组合2个包装完成(

下面是audio_service插件示例中提到的SeekBar

// A seek bar.
StreamBuilder<MediaState>(
stream: _mediaStateStream,
builder: (context, snapshot) {
final mediaState = snapshot.data;
return SeekBar(
duration:
mediaState?.mediaItem?.duration ?? Duration.zero,
position: mediaState?.position ?? Duration.zero,
onChangeEnd: (newPosition) {
AudioService.seekTo(newPosition);
},
);
},
),
...
class SeekBar extends StatefulWidget {
final Duration duration;
final Duration position;
final ValueChanged<Duration>? onChanged;
final ValueChanged<Duration>? onChangeEnd;
SeekBar({
required this.duration,
required this.position,
this.onChanged,
this.onChangeEnd,
});
@override
_SeekBarState createState() => _SeekBarState();
}
// more code in the plugin example

现在,从上面的代码中,您可以看到该示例使用自定义设计的SeekBar(它使用滑块(。

您可以使用您想要的插件小部件,而不是自定义滑块。ProgressBar

StreamBuilder<MediaState>(
stream: _mediaStateStream,
builder: (context, snapshot) {
final mediaState = snapshot.data;
return ProgressBar(
total:
mediaState?.mediaItem?.duration ?? Duration.zero,
progress: mediaState?.position ?? Duration.zero,
onSeek: (newPosition) {
AudioService.seekTo(newPosition);
},
);
},
),

这是上述SeekBarProgressBar的变化。(组合第三个包装完成(

注:对于buffered。您可以从音频服务PlaybackStateStream中获取bufferedPosition

编辑:以下是我如何使用它添加bufferedPosition

(我更改了MediaState类,相应的状态getter实现了一点(

StreamBuilder<MediaState>(
stream: _mediaStateStream,
builder: (context, snapshot) {
final mediaState = snapshot.data;
return ProgressBar(
total:
mediaState?.mediaItem?.duration ?? Duration.zero,
progress: mediaState?.position ?? Duration.zero,
buffered: mediaState?.playbackState?
.bufferedPosition ?? Duration.zero,
onSeek: (newPosition) {
AudioService.seekTo(newPosition);
},
);
},
),
...
Stream<MediaState> get _mediaStateStream =>
Rx.combineLatest3<MediaItem, Duration, PlaybackState, MediaState>(
AudioService.currentMediaItemStream,
AudioService.positionStream,
AudioService.playbackStateStream,
(mediaItem, position, playbackState) =>
MediaState(mediaItem, position, playbackState));
...
class MediaState {
final MediaItem mediaItem;
final Duration position;
final PlaybackState playbackState;
MediaState(this.mediaItem, this.position, this.playbackState);
}

最新更新